主元素問題 減治法

2022-06-04 07:09:09 字數 735 閱讀 8696

乙個有n個元素的序列a中,出現次數大於n/2的元素稱為主元素。現給定乙個序列(保證存在主元素),求其主元素

。以下假設a的主元素存在,且出現了k次,則其他元素出現的次數為n - k,二者的差記為c = 2k-n。可知x為主元素當且僅當 c > 0。

1. 若 x 確實為a的主元素,則a剪去字首p後得到的字尾s,x的個數與非主元素的個數都減少了m,但二者的差仍為c,所以字尾s的主元素必然也是x。

2. 若a的主元素不是 x,而是另乙個元素y,那麼剪去p後,至少除去了m個非主元素,所以字尾s中的c不會減小,s的主元素仍為y。

實現上,我們維護乙個「差額計數器c」 和乙個當前候選值maj ,初始化maj=a[0], c = 1。

從左到右掃瞄序列a,若a[i]==maj則c++,否則c--。當c減到0時,說明maj在當前的長度為2m的區間內恰好出現了m次,根據上面的分析,此時可以放心地剪去當前區間,只考慮字尾;所以我們置新的maj = a[i], c = 1,繼續掃瞄至結尾,最終maj的值就是最後乙個字尾的主元素。

若不確定原序列a是否存在主元素,可以掃瞄一遍統計下maj的個數。

題目嘛,找到了這麼一道:

參考了 

1

int majorityelement(vector&nums) else

8 major == nums[i] ? c++ : c--;9}

10return

major;

11 }

分治法解主元素問題

目錄 編寫 實驗資料 資料分析 總結參考資料 分治法的思想是將乙個難以直接解決的大問題劃分成一些規模較小的子問題,分別求解各個子問題,再合併子問題的解得到原問題的解。一般來說,分治法的求解過程由以下二個階段組成 劃分 把規模為 n 的原問題劃分為 k 個規模較小的子問題。求解子問題 各子問題的解法與...

主元素問題

主元素 majority number 定義為陣列中出現次數嚴格超過一半的數。找到這個數。要求使用o 1 的額外空間和o n 的時間。初階 有n個數,其中乙個數的出現次數嚴格超過了一半。求這個數。高階1 有n個數,其中兩個數的出現次數都超過了 求這兩個數。高階2 有n個數,其中乙個數的出現次數嚴格超...

主元素問題

設a是含有n個元素的陣列,如果元素x在a中出現的次數大於n 2,則稱x是a的主元素。給出乙個演算法,判斷a中是否存在主元素。因為主元素的個數大於n 2,如果兩個不同的元素兩兩抵消,最後若完全抵消,那麼就不存在主元素 若沒有完全抵消,那麼餘下的元素可能就是主元素,因此統計該元素的出現次數,即可判定是否...