每日一道演算法題--leetcode 169--求眾數--python--兩種方法

杉杉不要bug發表於2019-04-11

【題目描述】

【求眾數I】

每日一道演算法題--leetcode 169--求眾數--python--兩種方法
【演算法思路】

【方法一】

在不要求時間空間複雜度的情況下,可以採用的方法很多,最簡單易懂的一種就是對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
複製程式碼

相關文章