該演算法用於解決尋找乙個含有
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,則時間複雜度會超過線性複雜度。除此之外,也沒有什麼特別好的辦法。今天在...