169.多數元素

解題思路

解法一:排序法

如果將數組 nums 中的所有元素按照單調遞增或單調遞減的順序排序,那麼下標爲 ⌊n/2⌋ 的元素(下標從 0 開始)一定是衆數。
複雜度分析:
時間複雜度:O(nlogn)。將數組排序的時間複雜度爲 O(nlogn)。
空間複雜度:O(logn)。如果使用語言自帶的排序算法,需要使用 O(logn) 的棧空間。如果自己編寫堆排序,則只需要使用 O(1)的額外空間。

解法二:Boyer-Moore 投票法

我們維護一個候選衆數 candidate 和它出現的次數 count。初始時 candidate 可以爲任意值,count 爲 0。然後遍歷數組 nums 中的所有元素,對於每個元素 x,在判斷 x 之前,如果 count 的值爲 0,我們先將 x 的值賦予 candidate,隨後我們判斷 x:
如果 x 與 candidate 相等,那麼計數器 count 的值增加 1;
如果 x 與 candidate 不等,那麼計數器 count 的值減少 1。
在遍歷完成後,candidate 即爲整個數組的衆數。

複雜度分析:
時間複雜度:O(n)。Boyer-Moore 算法只對數組進行了一次遍歷。
空間複雜度:O(1)。Boyer-Moore 算法只需要常數級別的額外空間。

解法三:哈希字典法

遍歷數組,如果在字典中,則對應的值加1,否則將其加入字典。最後遍歷一遍字典,返回值大於n/2的鍵。

代碼

解法一:排序法

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        nums.sort()
        return nums[len(nums)//2]

解法二:投票法

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        count = 0
        candidate = None
        for num in nums:
            if count == 0:
                candidate = num
            count += (1 if candidate == num else -1)
        return candidate

解法三:哈希字典法

class Solution:
    def majorityElement(self, nums: List[int]) -> int:
        n = len(nums)
        dic = {}
        for num in nums:
            if num in dic:
                dic[num] += 1
            else:
                dic[num] = 1
        for i in dic:
            if dic[i] > n/2:
                return i
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章