摩爾投票法

2021-10-12 19:43:07 字數 1037 閱讀 6880

知乎簡介

首先請考慮最基本的摩爾投票問題,找出一組數字序列**現次數大於總數1/2的數字(並且假設這個數字一定存在)。顯然這個數字只可能有乙個。摩爾投票演算法是基於這個事實:每次從序列裡選擇兩個不相同的數字刪除掉(或稱為「抵消」),最後剩下乙個數字或幾個相同的數字,就是出現次數大於總數一半的那個。

形象化描述

想象著這樣乙個畫面:會議大廳站滿了投票代表,每個都有乙個牌子上面寫著自己所選的候選人的名字。然後選舉意見不合的(所選的候選人不同)兩個人,會打一架,並且會同時擊倒對方。顯而易見,如果乙個人擁有的選票比其它所有人加起來的選票還要多的話,這個候選人將會贏得這場「戰爭」,當混亂結束,最後剩下的那個代表(可能會有多個)將會來自多數人所站的陣營。但是如果所有參加候選人的選票都不是大多數(選票都未超過一半),那麼最後站在那的代表(乙個人)並不能代表所有的選票的大多數。因此,當某人站到最後時,需要統計他所選的候選人的選票是否超過一半(包括倒下的),來判斷選票結果是否有效。

解讀

減治(通過不斷地消去不同的元素來縮小陣列元素區間)

通過抵消掉最後的數不一定是眾數,仍需判斷(這裡眾數的定義是超過陣列一半個數的數)

例題:leetcode面試題17.10

陣列中佔比超過一半的元素稱之為主要元素。給定乙個整數陣列,找到它的主要元素。若沒有,返回-1。

要求時間複雜度 o(n),空間複雜度o(1)

int

majorityelement

(vector<

int>

& nums)

else}if

(cnt>0)

if(t>nums.

size()

/2)//仍需加以判斷

return major;

}return-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一下 思路上一題中,超過一半的數隻可能有乙個,所以我們只要投票出乙個數就行...