之前問的一個問題http://topic.csdn.net/u/20100430/16/3a815617-9d6f-4945-b15c-14dfecfe4b23.html?seed=1361273005&r=65129463#r_65129463
一開始覺得尋找中位元的方法已經很不錯了,後來又發現了一個更加簡單的方法,果然大家都很厲害呢,集思廣益,可以從大家這裡學到很多考慮問題的方法。
下面這些都是摘抄大家的回答,和我自己的實現。
題目:
已知有一個數組Array[N],其中有一個元素在數組中出現的次數超過了N/2次,請找出這個元素,要求時間複雜度為O(n)。
演算法思想:
方法1. 尋找中位元,這個就不詳說了
方法2. 如果刪去原序列中的兩個不同元素,則原序列中的主要元素仍然在剩下的序列中 。
實現:
只許要每次如果遇到和暫時預定的結果是同一個數的話就計數加1。
否則計數減1。。 如果計數減到0的話說明前面的數有相同的和不同的數相同的數目
所以在這裡可以當一個新的開始。。把下個數當新的預定數。。 直到最後那個數
如果降到0這個點上的話就可以把這個點當作新的起點。
這個方法可行性是基於相同數超過n/2這個基礎上的
#include <iostream><br />using namespace std;</p><p>const int N=10;</p><p>int find_maj_num(int *A, int n)<br />{<br /> int tmp=A[0];<br /> int num=0;<br /> for (int i=0;i<n;i++)<br /> if(tmp==A[i])<br /> num++;<br /> else<br /> {<br /> num--;<br /> if(num==0)<br /> tmp=((i+1)>=n)?NULL:A[i+1];<br /> }<br /> return tmp;<br />}</p><p>int main()<br />{<br /> int Array[10]={2,4,2,3,2,2,5,5,2,2}; </p><p> int output=find_maj_num(Array,N);<br /> cout << output << endl;<br /> while(1);<br /> return 0;<br />}<br />