【題目描述】
【求眾數I】
【演算法思路】【方法一】
在不要求時間空間複雜度的情況下,可以採用的方法很多,最簡單易懂的一種就是對nums中每個值統計一下數量,如果數量大於nums長度的一半,就直接返回。程式碼如下:
class Solution(object):
def majorityElement(self, nums):
for i in list(set(nums)):
if nums.count(i)>len(nums)/2:
return i
複製程式碼
【方法二】
摩爾投票法,是一種多數派想法
1.對於v[i],如果c此時為未知狀態,則c=v[i],t=1,遞增i。
2.如果c==v[i],++t,遞增i。
3.如果c!=v[i],–t,如果t==0,將c置為未知狀態,遞增i。
4.所有投票處理完畢後,如果c為未知狀態,則說明不存在任何候選人的得票數過半,否則重新遍歷陣列v,統計候選人c的實際得票總數,如果c的得票數確實過半,則c就是最終結果。
就是這個數在nums中出現次數過半,那麼不管如何抵消,最終終會使c等於這個眾數,t>=1。時間複雜度O(n),空間複雜度O(1),程式碼如下:
class Solution(object):
def majorityElement(self, nums):
m=cm=0
for n in nums:
if n==m:
cm+=1
elif cm==0:
m=n
cm=1
else:
cm-=1
return m
複製程式碼