摩爾投票法 229 求眾數 II

2021-10-06 17:55:33 字數 1270 閱讀 7628

給定乙個大小為 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 什麼的情況也一樣,畫一畫就明白了。然後這是別人的解析 摩爾投票法 ...