摩爾投票法 針對陣列中眾數的演算法

2021-09-22 07:52:23 字數 1001 閱讀 3640

文章**:

摩爾投票法

提問: 給定乙個int型陣列,找出該陣列**現次數最多的int值。

解決方案: 遍歷該陣列,統計每個int值出現次數,再遍歷該集合,取出出現次數最大的int值。

這算是乙個比較經典的解決辦法,其中可能會用到map來做統計。如果不使用map,則時間複雜度會超過線性複雜度。除此之外,也沒有什麼特別好的辦法。

今天在leetcode上遇到這樣一道題目,

提問: 給定乙個int型陣列,找出該陣列**現次數大於陣列長度一半的int值。

解決方案: 遍歷該陣列,統計每個int值出現次數,再遍歷該集合,找出出現次數大於陣列長度一半的int值。

同樣的,該解決辦法也要求使用map,否則無法達到線性的時間複雜度。

那麼對於這個問題,有沒有什麼不使用map的線性演算法呢?

答案就是今天我們要提到的摩爾投票法。利用該演算法來解決這個問題,我們可以達到線性的時間複雜度以及常量級的空間複雜度。

首先我們注意到這樣乙個現象: 在任何陣列中,出現次數大於該陣列長度一半的值只能有乙個。

通過數學知識,我們可以證明它的正確性,但是這並不在我們這篇部落格裡涉及。

摩爾投票法的基本思想很簡單,在每一輪投票過程中,從陣列中找出一對不同的元素,將其從陣列中刪除。這樣不斷的刪除直到無法再進行投票,如果陣列為空,則沒有任何元素出現的次數超過該陣列長度的一半。如果只存在一種元素,那麼這個元素則可能為目標元素。

那麼有沒有可能出現最後有兩種或兩種以上元素呢?根據定義,這是不可能的,因為如果出現這種情況,則代表我們可以繼續一輪投票。因此,最終只能是剩下零個或乙個元素。

再次遍歷一遍陣列,記錄c真正出現的次數,從而驗證c是否真的出現了超過半數。上述演算法的時間複雜度為o(n),而由於並不需要真的刪除陣列元素,我們也並不需要額外的空間來儲存原始陣列,空間複雜度為o(1)。

public int majorityelement(int nums) 

else

}return res;

}

摩爾投票法在LeetCode169中的應用

leetcode 169.多數元素 給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數 大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。示例 1 輸入 3,2,3 輸出 3示例 2 輸入 2,2,1,1,1,2,2 輸出 2 class solu...

分治法求陣列中的眾數

先說一下題目吧,很簡單,就是給一組陣列,求陣列中的眾數,但是要用分治法。首先是要運用快排的分割演算法,設函式名為quick,重複次數設定為n,眾數設為mode,陣列長度即為length.c 實現的 如下 includeusing namespace std 全域性變數儲存重數 int n 0 全域性...

Java針對陣列的普通查詢法和二分查詢法

下面是針對陣列的普通查詢法和二分查詢法的示例 packagecom.jadyer.sort 陣列查詢方式 detail 這裡演示了普通查詢法和二分查詢法 public classarraysearch 9 intbinaryresult binarysearch new int,8 system.o...