摩爾投票法

2021-10-03 20:43:46 字數 1562 閱讀 2708

核心就是對拼消耗。

玩乙個諸侯爭霸的遊戲,假設你方人口超過總人口一半以上,並且能保證每個人口出去幹仗都能一對一同歸於盡。最後還有人活下來的國家就是勝利。

那就大混戰唄,最差所有人都聯合起來對付你(對應你每次選擇作為計數器的數都是眾數),或者其他國家也會相互攻擊(會選擇其他數作為計數器的數),但是只要你們不要內鬥,最後肯定你贏。

最後能剩下的必定是自己人。

應用:查詢列表**現次數大於n/m的元素

例一、多數元數

給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列**現次數大於 ⌊ n/2 ⌋ 的元素。

你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。

示例 1:

輸入: [3,2,3]

輸出: 3

示例 2:

輸入: [2,2,1,1,1,2,2]

輸出: 2

**

int

majorityelement

(int

* nums,

int numssize)

else

if(a==0)

else

} a=0;

for(i=

1;iif(a>numssize)

return value

else

return value;

}

例2、求列表**現次數大於列表長度⌊ n/3 ⌋的數

思路:符合題意的數可能有2個,改進一下摩爾投票法,設定2個變數m、n和2個計數變數cm、cn,遍歷一次列表即可求得最終的m、n,再檢查一下次數

#include

//查詢元素大於1/3的,設定兩個

intmain()

;int i;

int count1=

0,count2=0;

int value1=

null

,value2=

null

;//摩爾投票法 ,先判斷是否相等,再判斷是否為0,否則個數減一

for(i=

0;i<

3;i++

)else

if(a[i]

==value2)

else

if(count1==0)

else

if(count2==0)

else

}//判斷有沒有超過1/3

count1=0;

count2=0;

for(i=

0;i<

3;i++)if

(count1>3/

3)printf

("%d"

,value1);if

(count2>3/

3)printf

("%d"

,value2)

;return0;

}

例3、推廣m,即求列表**現次數大於列表長度⌊ n/m ⌋的數。

候選人有m-1個,相應地設定m-1個候選變數和計數變數。

借鑑:力扣:

知乎:

摩爾投票法

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

摩爾投票法

該演算法用於解決尋找乙個含有 n n 個元素的數列 role presentation 中出現超過1k 1 k 即大於nk n k次 的元素 假設滿足要求的元素存在 可知,滿足要求的元素最多有 k 1 k 1 個。使用暴力解法並不難,但是摩爾投票法給出了乙個o n o n 時間複雜度的解法。當k 2...

摩爾投票法

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