《Leetcode》面試題39. 數組中出現次數超過一半的數字

數組中有一個數字出你可以假設數組是非空的,並且給定的數組總是存在多數元素。

現的次數超過數組長度的一半,請找出這個數字。

示例 1:

輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
輸出: 2

思路:

1、題目分析

題目的要求就是要找出數組中出現次數大於數組長度一半的數字。

2、解題分析

這個數字如果出現的次數比數組長度一半都大,那麼肯定是衆數。第一種方法:那麼對這個數組進行排序去中間的數就是這個數字了。第二種方法:採用哈希表去統計每個數字出現的次數然後遍歷哈希表找出出現的次數大於數組長度一半的數組。第三種方法:摩爾投票法。代碼示例:
 

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        
        #hash法
        dic = collections.defaultdict(int)
        size = len(nums)/2
        for i in nums:
            dic[i]+=1
        for k,v in dic.items():
            if v>size:
                return k
        


        #摩爾法
        votes = 0
        for num in nums:
            if votes == 0:
                x = num
            votes += 1 if num == x else -1
        return x
        
        #排序法
        return sorted(nums)[len(nums)//2]

時間和空間複雜度依次爲O(N) ,O(Nlog2​N)和O(1),O(N)和O(1)。

總結:沒啥特別的,摩爾投票法需要了解一下。以後專門寫一篇介紹摩爾投票法。

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