給定一個大小爲 n 的數組,找到其中的多數元素。多數元素是指在數組中出現次數大於 ⌊ n/2 ⌋ 的元素。
你可以假設數組是非空的,並且給定的數組總是存在多數元素。
示例 1:
輸入: [3,2,3]
輸出: 3
示例 2:
輸入: [2,2,1,1,1,2,2]
輸出: 2
題目要求返回出現次數大於⌊ n/2 ⌋
的元素,這裏需要向下取整,並使用Counter()
統計數組中元素及其出現的次數,最後遍歷統計字典中元素的值,找到值大於⌊ n/2 ⌋
的鍵返回即可。
class Solution:
def majorityElement(self, nums: List[int]) -> int:
if not nums: return 0
l = len(nums) // 2
d = Counter(nums)
for k, v in d.items():
if v > l:
return k
return 0
另外在題解中還看到兩種有意思的方法,一種是隨機法:因爲所屬元素的個數要大於 ⌊ n/2 ⌋ ,那麼表示數組中超過一半的元素都是最後要找的元素,那麼隨機選擇一個元素就是要求的數的概率也就大於0.5.因此,可以採用隨機取數判斷的方法解決。
import random
class Solution:
def majorityElement(self, nums):
majority_count = len(nums)//2
while True:
candidate = random.choice(nums)
if sum(1 for elem in nums if elem == candidate) > majority_count:
return candidate
還有一種第一次見到的摩爾投票法,詳細題解可見江不知 - 圖解摩爾投票法(Python & Go)
class Solution(object):
def majorityElement(self, nums):
major = 0
count = 0
for n in nums:
if count == 0:
major = n
if n == major:
count = count + 1
else:
count = count - 1
return major