169 - 多數元素 - python

給定一個大小爲 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章