o(n)求眾數 不用桶眾數的求解方式一般是用桶來計算,但是有時候資料比較大,桶開不了這麼大,就需要用map,這就在o(n)的基礎上加了個log。
摩爾投票法基於這樣乙個事實,當乙個數的重複次數超過陣列長度的一半,每次將兩個不相同的數刪除,最終剩下的就是要找的數。
當然,我們要求乙個數列的眾數,這個數列首先要存在眾數。我們這個演算法的前提條件是這個數列確實有眾數存在(並且這個眾數出現的次數要大於數列長度的一半)。
為了更容易理解,我們將每一種數想象成乙個幫派
有眾數幫,和非眾數幫,這些所有的幫派中彼此仇恨,兩個不同幫派的人遇到了,必要掐架,並且下場是兩人同歸於盡
因為眾數幫成員,佔據了所有成員數量的一半以上,所以無論怎麼掐架,就算所有的幫派聯合起來打它,它最終也會剩下成員,而其它幫派的人會盡數歸西~。
大概的過程是,我們考察所有人(遍歷整個序列),從第乙個人開始,他先登上歷史舞台,站在武林山上大喊,老子是眾數幫,誰來搞我,接下來第二個人來了,如果他們兩個是乙個幫派的(相等),那劇情就變成了兩人一起喊:誰tm來搞我倆。
如果不是乙個幫派的呢?兩人自然掐的同歸於盡,這時就便宜了第三個人,第三個人也會像第乙個人一樣:老子是眾數幫,誰來搞我。。。。。迴圈往復,到了最後,剩下的人(>=1) 就可以光榮的宣布:眾數幫其實是我們~。
int wulinshan;
for(int i=0,c=0; ielse
}printf("%d",wulinshan);
摩爾投票法 229 求眾數 II
給定乙個大小為 n 的陣列,找出其中所有出現超過 n 3 次的元素。說明 要求演算法的時間複雜度為 o n 空間複雜度為 o 1 示例 1 輸入 3 2,3 輸出 3 示例 2 輸入 1 1,1 3,3 2,2 2 輸出 1 2 解題 當要找大於n 2個個數的多數時,使用投票法,每次計數,當計數 0...
摩爾投票法
刷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...