刷題過程中遇到的乙個非常巧妙的演算法。是出現在「求陣列**現超過一半的數字」這道題中。
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。思路:如果把陣列中的眾數(即題目中的出現超過一半的數字)記為1,把其他數記為-1,再把它們全部加起來,顯然和應該大於0,這是因為這道題的特點是眾數超過了總數的一半。基於這個規律,可以設計乙個演算法:我們選擇第乙個數作為候選眾數,並維護乙個計數器,初始令計數器等於1,。然後往後遍歷陣列,如果遇到當前的候選眾數,就將計數器加一,否則將計數器減一。只要計數器等於0,我們就選擇下乙個數作為新的眾數,並將計數器重新置為1,這樣最終得到的這個數就是超過陣列半數的眾數。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。
例項1輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
輸出: 2
1 <= 陣列長度 <= 50000
class
solution
else
if(candidate == i)
else
}return candidate;}}
;
Boyer Moore 投票演算法
有以下問題 給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數 大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。比較容易想到的解法是用雜湊表對每個數出現的次數進行儲存,然後就可以找出次數最多的那個數了。這樣做的時間和空間複雜度都是 o n o n...
摩爾 Boyer Moore 投票法
該演算法用來尋找乙個陣列 現次數超過1 k的元素,易得滿足要求的元素最多有k 1個。摩爾投票法分為兩個階段 抵消階段和計數階段。抵消階段 兩個不同投票進行對坑,並且同時抵消掉各一張票,如果兩個投票相同,則累加可抵消的次數 計數階段 在抵消階段最後得到的抵消計數只要不為0,那這個候選人是有可能超過一半...
Boyer Moore 投票演算法求過半數
維護候選眾數candidate以及該候選的出現次數count 初始化 candidate為任意值,count為0 遍歷陣列nums,對於每個元素x 1 若count 0,則candidate x 2 若x candidate x,則count 否則count 遍歷完成後,candidate即為整個陣...