一、題目描述:
二、演算法思想:本演算法的巧妙之處在於充分利用主元素的定義,即在序列中個數超過半數的元素。那麼在動態統計的過程中,主元素出現的頻率要最大可能的大於1/2。由於是動態統計,所以可能在區域性範圍內可能出現誤判,當主元素在序列分布不均時,可能一開始出現誤判,但最終是會被糾正的,這個是可以通過數學證明一下。由於是必要條件,所以在最後還要進行充分性驗證。
具體演算法可以分為以下兩步:
1)選取候選主元素:一次掃瞄所給陣列中的每個整數,將第乙個遇到的整數num儲存到c中,記錄num的出現次數為1。若遇到的下乙個整數仍為num,則計數加1,否則計數減1。當計數減到0時,將遇到的下乙個整數儲存到c中,計數重新記為1,開始新一輪的計數(此處是演算法的關鍵,通過這種方式模擬主元素出現的頻率應該大於1/2),即從當前位置開始重複上述過程,直到掃瞄完全部陣列元素。(必要性)
2)判斷c中元素是否是真正的主元素:再次掃瞄該陣列,統計c中元素出現的次數,若大於n/2,則為主元素,否則序列中不存在主元素。(充分性)
三、核心**:
int main_search(int a,int n)}}
for(i=0;in/2)
return c;//確認候選元素
else
return -1;//不存在主元素
}
四、完整**:
#includeint main_search(int a,int n); void print(int a,int n); int main() ; int a=; int n=sizeof(a)/sizeof(int); print(a,n); printf("%d\n",main_search(a,n)); return 0; } int main_search(int a,int n) } } /*充分性驗證,保證主元素出現的頻率大於1/2*/ for(i=0;in/2) return c;//確認候選元素 else return -1;//不存在主元素 } void print(int a,int n) { int i; for(i=0;i五、測試分析:時間複雜度o(n),空間複雜度1
渣渣渣變渣渣系列(1)
一 題目描述 408聯考 2010真題 二 演算法思想 可以將這個問題看作是把陣列ab轉換為ba a代表陣列的前p個元素,b代表陣列中的餘下n p個元素 先將a逆置得到a 1b,再將b逆置得到a 1b 1,最後將整個a 1b 1逆置為 a 1b 1 1 ba。三 核心 void reverse in...
渣渣渣變渣渣系列(2)
一 題目描述 408聯考真題 2011 二 演算法思想 分別求兩個公升序序列a和b的中位數,設為a和b,求序列a和b的中位數過程如下 1 若a b,則a或b即為所求中位數,演算法結束。2 若a3 若a b,則捨棄序列a中較大的一半,同時捨棄序列b中較小的一半,要求兩次捨棄的長度相等。在保留的兩個公升...
渣渣演變之路
讀入乙個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。輸入格式 每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10100。輸出格式 在一行內輸出n的各位數字之和的每一位,拼音數字間有1 空格,但一行中最後乙個拼音數字後沒有空格。輸入樣例 123456789098765...