leet169. Majority Element
阿新 • • 發佈:2018-11-10
題目:
給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋
的元素。
分析:
- 最簡單的方法是使用庫函式對陣列排序,第
⌊ n/2 ⌋
個數即為眾數,但時間複雜度為O(nlgn) - 為降低時間複雜度,採用計數方式,並記錄最大頻次和對應元素,遍歷後返回最大頻次對應元素,時間複雜度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]
思考:
- 看討論區找到一種時間複雜度相同,空間複雜度更有,只有O(1)的演算法。思路是:選取一個主元,計數器設定為1,遍歷陣列,當前元素與主元相同,計數器加1,否則減1;當計數器減為0,將當前元素設為主元,重複上述步驟,由於眾數數量大於陣列長度一半,因此最終保留的主元一定是總數,程式碼如下:(leetcode caikehe)
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
- 以上程式碼可以增加對count的判斷,若count大於剩餘元素數量,則跳出遍歷,直接返回主元,對於眾數分佈整體靠前的情況下,可以節約時間
- 以上程式碼在眾數不存在情況下無法得出正確結果
- 我自己的程式碼,只需增加對最大頻次與陣列長度一半長度比對,可以適應無眾數的情形