演算法 摩爾投票法

2021-10-06 05:41:38 字數 655 閱讀 8229

遇到乙個演算法的題目,找到陣列**現次數最多的數,並且判斷是否超過了陣列一半。

我最開始想了3種方案,

第一種:用hashset把資料傳入,並且記錄false的次數,最後和陣列長度比較。

第二種:用兩個指標迴圈比較資料有沒有重複的,有的話count+1,最和陣列長度比較。

第三種:第三種就是本文要介紹的一種演算法,摩爾投票法。前面兩種都能實現功能,但有個問題,在複雜度和空間都很高。

public

static

void

main

(string[

] args)

;int i =0;

int count1 =0;

//遍歷整個陣列,在遍歷的過程中找到出現次數最多的數

for(

int num : nums)

else

else}}

int count2 =0;

//先判斷是否有眾數

if(count1 <=0)

else}}

//判斷出現的次數是否超過陣列的一半

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