摩爾投票法

2021-10-14 16:33:47 字數 619 閱讀 9971

給定乙個長度為n的陣列,請找出其**現次數大於 n/2的元素(假設一定存在)

解決這個問題本身並不困難,大不了建個字典就行。麻煩的是如何在一次遍歷、使用o(1)空間解決?這就引出了摩爾投票法。

偽**如下:

given a of length n;

function findmajorelement(a: array of length n)

:int cnt =

0, major =-1

;for i in a:

if cnt ==0:

major = i

cnt =

1else

:if major == i:

cnt +=

1else

: cnt -=

1return major

演算法背後的邏輯也很簡單:想象乙個大混戰。有很多門派參加,這些門派的**功力近似而且講究武德只單挑不群毆(所以峨眉山的**和武當山的**碰面了就同歸於盡了),但是同門派的不能自相殘殺(所以武當山的遇見武當山的就相安無事)。

那麼,大混戰到最後,自然是人數最多的(超過 n/2)的門派笑到最後啦。

摩爾投票法

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