找出乙個陣列**現次數超過一半的數字,例如 2 0 3 0 1 0 0 0 0 0 1 這個陣列中,出現次數最多的是 0,並且超過了一半。所以應該是0.
解決思路:
最簡單的思路,每個數字出現了之後就記錄一下,找到之前有沒有出現過,有的話就次數加1 這個裡面有個小問題是,如果數字很多的話,要找到之前有沒有出現過比較困難。所以可以改進一下,通過hash,進行記錄。每次找個乙個值之後通過hash找到應該記錄的位置,如果位置上有資料就判斷一下有幾個資料找到相同的資料,記錄次數+1。這個演算法時間複雜度應該是o(n),但是如果hash的演算法導致有大量的重複的話,或者說資料量太大導致有大量的重複,可能效果就不一定會好。
將資料進行排序,如果乙個數的長度超過了一半的數字,那麼這個數字一定在中間,或者說中間一定有,這樣的話,我們就可以先排序,然後取中位數,然後遍歷一遍,確認一下中位數是我們想要的資料,因為有可能沒有這個資料。
這個的時間複雜度,主要取決於排序演算法的時間複雜度,然後加上一次遍歷的時間。
多數投票發,時間複雜度可能是最小的 。主要的思路是這樣的,遍歷兩遍,第一遍,用乙個資料count 記錄次數,用value 記錄出現場的值,當count==0的時候,value==正在遍歷的值,當count !=0,那麼如果下乙個出現的值不少等於value,count減一,如果下乙個出現的值等於value,那麼count加一,最後的value 就是我們要計算的值。
int candidate = 0;
int count = 0;
for(aotu i=input.begin();i**沒有跑過,只是表明思路,
得到了value之後,遍歷一遍確認一下出現的次數是不是大於一半。那麼我們就可以就找到了這個引數了。
原因:陣列的資料可以分成兩類,一類是我們想要得到的值ai,一類是其他的值,在存在ai的情況下,ai的的數量一定是大於其他數的數量的,當我們的value不小心不等於ai的時候,碰到了ai的時候,一定存在某個時刻count==0,因為ai的數量多於其他的數量。並且這個時候一後面沒有變數的資料中ai的數量一定是多於其他的數的。所以count==0的可以看成是ai和其他的非ai的數成對的消失,那麼到了最後,一定只剩下ai了。然後遍歷最後一變確認一下,防止本來就沒有ai這個數的情況。
可以參考:
摩爾投票法和大多數
摩爾投票演算法 假設有這樣乙個場景 票選村長,每人可投一票,我們將候選村長從1開始編號,村民們在票上寫上候選村長的編號即可完成投票。那麼最後統計的票可形成乙個整型陣列。那麼誰是村長呢?票數過半的那個人。摩爾投票演算法可以快速的計算出乙個陣列 現次數過半的數即大多數 majority 演算法核心思想是...
多數投票演算法
多數投票演算法 在乙個陣列中,元素個數為n,獲得元素出現次數大於n 2的數,如果有滿足條件的數,輸出該數 沒有滿足條件的數,輸出 1。使用lua實現該演算法 普通思路 1 遍歷該陣列,將陣列中出現的每個數儲存在table表count中 2 設定result為 1表示需要返回的數,遍歷count,將出...
力扣 169求多數元素 投票法
官方解法中有乙個值得學習的投票法 方法 6 boyer moore 投票演算法 想法如果我們把眾數記為 1 1 把其他數記為 1 1 將它們全部加起來,顯然和大於 0 從結果本身我們可以看出眾數比其他數多。演算法本質上,boyer moore 演算法就是找 nums 的乙個字尾 sufsuf 其中 ...