給定乙個大小為 n 的陣列,找出其中所有出現超過 ⌊ n/3 ⌋ 次的元素。
說明: 要求演算法的時間複雜度為 o(n),空間複雜度為 o(1)。
示例 1:
輸入:[3
,2,3
]輸出:[3
]
示例 2:
輸入:[1
,1,1
,3,3
,2,2
,2]輸出:[1
,2]
解題
當要找大於n/2個個數的多數時,使用投票法,每次計數,當計數<0時,換個候選數計數,最後得到的即為大於半數的候選數;
找大於n/3的數,最多有2個,故建立兩個候選數!
(1)第乙個匹配則計數1++,繼續匹配下乙個數;
(2)第二個匹配則計數2++,繼續匹配下乙個數;
(3)第乙個數不匹配且計數為0,則換第乙個候選數,計數=1,看下乙個數;
(4)第二個數不匹配且計數為0,則換第二個候選數,計數=1,看下乙個數;
(5)都不匹配且計數都大於0,則兩個計數都–;
最後檢視候選數是否多餘n/3,是則放入結果,否則不放入;
class
solution
;//超過1/3的最多兩個人
int candidate1=nums[0]
;int candidate2=nums[0]
;int cnt1=0;
int cnt2=0;
//第乙個匹配上了 ,第二個就不匹配
//第乙個沒匹配上,第二個嘗試匹配
for(
int i=
0;i(candidate2==nums[i])if
(cnt1==0)
if(cnt2==0)
cnt1--
; cnt2--;}
//檢視是否大於1/3
cnt1=0;
cnt2=0;
for(
int i=
0;i) vector<
int> res;
if(cnt1>n/
3) res.
push_back
(candidate1);if
(cnt2>n/
3) res.
push_back
(candidate2)
;return res;}}
;
摩爾投票法 O n 求眾數 不用桶
o n 求眾數 不用桶 眾數的求解方式一般是用桶來計算,但是有時候資料比較大,桶開不了這麼大,就需要用map,這就在o n 的基礎上加了個log。摩爾投票法基於這樣乙個事實,當乙個數的重複次數超過陣列長度的一半,每次將兩個不相同的數刪除,最終剩下的就是要找的數。當然,我們要求乙個數列的眾數,這個數列...
169 求眾數 229 求眾數 II
不限定時間複雜度的話,很多人會先排序,再遍歷的方法來做。不限定空間複雜度的話,很多人會用hash表來做。那麼,有了這兩個限定,就只能用摩爾投票演算法了。主元素問題典型解法。摩爾投票演算法 時間複雜度o n 空間複雜度o 1 class solution else if nums i ans cnt ...
摩爾投票法
刷leetcode看到的一種解法。想法其實很簡單。上網上看了下這種解法叫摩爾投票法。其實就是找array裡的眾數,原理也很簡單,例如你要找2 n多的數你找眾數,那他個數肯定不小於2 n,然後你加加減減 最後留下那個肯定是眾數。3 n 什麼的情況也一樣,畫一畫就明白了。然後這是別人的解析 摩爾投票法 ...