尋找主要元素

來源:互聯網
上載者:User

之前問的一個問題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 />

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.