1. 程式人生 > >leet169. Majority Element

leet169. Majority Element

題目:

給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。

你可以假設陣列是非空的,並且陣列中的眾數永遠存在

分析:

  1. 最簡單的方法是使用庫函式對陣列排序,第⌊ n/2 ⌋個數即為眾數,但時間複雜度為O(nlgn)
  2. 為降低時間複雜度,採用計數方式,並記錄最大頻次和對應元素,遍歷後返回最大頻次對應元素,時間複雜度O(n),空間複雜度O(n)

程式碼:

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        numDict = {}
        maxCounts = [0,0]
        for x in nums:
            v = numDict.get(x) + 1 if numDict.get(x) else 1
            numDict[x] = v
            if v > maxCounts[0]:
                maxCounts = [v,x]
        return maxCounts[1]

思考:

  1. 看討論區找到一種時間複雜度相同,空間複雜度更有,只有O(1)的演算法。思路是:選取一個主元,計數器設定為1,遍歷陣列,當前元素與主元相同,計數器加1,否則減1;當計數器減為0,將當前元素設為主元,重複上述步驟,由於眾數數量大於陣列長度一半,因此最終保留的主元一定是總數,程式碼如下:(leetcode caikehe
  2. def majorityElement(self, nums):
        count, cand = 0, 0
        for num in nums:
            if num == cand:
                count += 1
            elif count == 0:
                cand, count = num, 1
            else:
                count -= 1
        return cand

  3. 以上程式碼可以增加對count的判斷,若count大於剩餘元素數量,則跳出遍歷,直接返回主元,對於眾數分佈整體靠前的情況下,可以節約時間
  4. 以上程式碼在眾數不存在情況下無法得出正確結果
  5. 我自己的程式碼,只需增加對最大頻次與陣列長度一半長度比對,可以適應無眾數的情形