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