摩爾投票法

2021-08-28 03:50:14 字數 2602 閱讀 7115

該演算法用於解決尋找乙個含有

n n

個元素的數列

' role="presentation">

中出現超過1k

1

k(即大於nk

n

k次)的元素(假設滿足要求的元素存在)。可知,滿足要求的元素最多有(k

−1) (k−

1)

個。使用暴力解法並不難,但是摩爾投票法給出了乙個o(

n)o (n

)時間複雜度的解法。

當k=2時

維護乙個初值為0的計數器counter,維護乙個任意初值的待返回元素result。遍歷

,執行以下操作:若當前值和result相同,則counter加一,否則減一;當counter減至0時,result更換為當前元素。遍歷結束時,返回result。

int majorityelement(vector

& nums)

else (num == res) ? ++cnt : --cnt;

}return res;

}

計正確答案應為r。

首先,如果counter從未減至0,則顯然a0

a

0出現的次數超過12

1 2。

如果遍歷完前2m項後,counter首次減至0,則

的前2m項中r出現次數不大於m,所以後(n

−2m)

( n−

2m

)項中r出現必然多於12

1

2。所以對後(n

−2m)

( n−

2m

)項進行摩爾投票,必然可以得到正確結果r。

當k=3時

維護兩個初值為0的計數器counter1和counter2,維護兩個初值不同的待返回元素result1和result2。遍歷

,執行以下操作:若當前值和某個result相同,則對應counter加一,若和兩個result都不同,則兩個counter都減一;若某一時刻,某乙個counter減至0,則result更換為當前元素;若某一時刻兩個result都是0,則對後面的元素進行摩爾投票。遍歷結束後,返回result1和result2中出現次數超過13

1

3的乙個或者兩個。

class solution 

else

if(counter2==0)

else

}counter1=0;

counter2=0;

for(int i=0;iif(cddt1==nums[i])counter1++;

else

if(cddt2==nums[i])counter2++;

}vector

v;if(counter1>nums.size()/3&&counter1!=0)v.push_back(cddt1);

if(counter2>nums.size()/3&&counter2!=0)v.push_back(cddt2);

return v;

}};

先找出n個數中出現次數最多的兩個數r1

r

1、r2

r

2,則兩數中出現次數超過13

1

3的乙個或者兩個即為所求結果。

同上,首先,如果counter從未減至0,則顯然出現沒有其他數字的出現次數多於a0

、a1 a0、

a1

。 如果遍歷完前(3

m+t)

( 3m

+t

)項後,某counter首次減至0,另一counter還是

t t

,不妨將這

t' role="presentation">t

t個result併入後(n

−3m−

t)( n−

3m−t

)項,則剩餘3m

3

m項中r1,r2出現次數不大於

m m

,所以歸併後的(n

−3m)

' role="presentation">(n−

3m)(

n−3m

)項中r1、r2出現必然多於13

1

3。所以對(n

−3m)

( n−

3m

)項(由之前歸併的

t t

個result和原陣列的後(n

−3m−

t)項組

成' role="presentation">(n−

3m−t

)項組成

(n−3

m−t)

項組成)進行摩爾投票,必然可以得到正確結果r1

r

1、r2

r 2。

當k>3時

同理,維護(k

−1) (k−

1)

個result和counter,找出出現次數最多的(k

−1) (k−

1)

個元素,最後分別計算出現次數,返回滿足要求的元素即可。

摩爾投票法

刷leetcode看到的一種解法。想法其實很簡單。上網上看了下這種解法叫摩爾投票法。其實就是找array裡的眾數,原理也很簡單,例如你要找2 n多的數你找眾數,那他個數肯定不小於2 n,然後你加加減減 最後留下那個肯定是眾數。3 n 什麼的情況也一樣,畫一畫就明白了。然後這是別人的解析 摩爾投票法 ...

摩爾投票法

複雜度時間 o n 空間 o 1 因為多於三分之一的數可能有2兩個,所以需要用兩個值和兩個計數器過一遍,但是最後得出來不一定是兩個數都是多於三分之一,有可能 只有乙個是多於三分之一,但不知道是哪乙個,所以要重新過一遍check一下 思路上一題中,超過一半的數隻可能有乙個,所以我們只要投票出乙個數就行...

摩爾投票法

提問 給定乙個int型陣列,找出該陣列 現次數最多的int值。解決方案 遍歷該陣列,統計每個int值出現次數,再遍歷該集合,取出出現次數最大的int值。這算是乙個比較經典的解決辦法,其中可能會用到map來做統計。如果不使用map,則時間複雜度會超過線性複雜度。除此之外,也沒有什麼特別好的辦法。今天在...