三道簡單演算法題(二)

來源:互聯網
上載者:User

1:試著用最少的比較次數去尋找數組中的最大值和最小值。

思路一:掃描數組兩次,第一次等到最大值,第二次等到最小值。總共比較次數2N,這是大家都可以想到的。

思路二:定義兩個變數存放最大值和最小值,將數組兩兩分組,兩兩進行比較,大的和最大值進行比較,小的和最小值比較,數組兩兩比較次數是N/2,分別與最大值和最小值比較的次數為N,總共比較次數1.5N。好久沒寫演算法了,於是蛋疼得想實現一下。

//1:試著用最少的比較次數去尋找數組中的最大值和最小值。 void FindMaxMin(int *A,int size,int* Max,int* Min){     int i=(size & 1)?1:0;    *Max=*Min=A[0];     for(;i<size;i=i+2)    {        if(A[i]>A[i+1])        {            if(A[i]>*Max)                 *Max=A[i];             if(A[i+1]<*Min)                 *Min=A[i+1];         }else{            if(A[i+1]>*Max)                 *Max=A[i+1];             if(A[i]<*Min)                 *Min=A[i];         }    }  }void FindMaxMinTest(){    int A[9]={2,4,6,8,9,1,3,5,7};    int Max=0;    int Min=0;    FindMaxMin(A,9,&Max,&Min);    cout<<Max<<endl;    cout<<Min<<endl;}

寫完之後,發現這太簡單了,不過癮,於是又實現了兩題,當然這三道題的思路都很早之前就看過。

2:給一個整數數組,求數組中重複出現次數大於數組總個數一半的數

按照抵消的思路,如果存在一個數出現的次數大於數組的一半,將這個數與其他不同的數進行一一抵消,最後剩下的必定就是這個數,然後再驗證這個數是否是真的出現次數超過數組的一半,實現如下,以前也實現過,但是發現這次的實現和以前的實現出入較大,這是為什麼呢?

//2:給一個整數數組,求數組中重複出現次數大於數組總個數一半的數int MoreThanHalf(int *A,int size){     int num=A[0];    int count=1;    for(int i=1;i<size;i++)    {         if(num==A[i])        {            count++;        }else{            count--;              if(count==0)            {                 num=A[i];                count=1;            }        }     }         count=0;    for(int i=0;i<size;i++)    {        if(A[i]==num)            count++;    }      return count>(size/2)? num:-1;}void MoreThanHalfTest(){    int A[9]={ 1, 1,2, 1, 2, 2, 1, 2, 2 };    cout<<MoreThanHalf( A,9);}

 

3:給一個很大的數組,裡面有兩個數只出現過一次,其他數都出現過兩次,把這兩個數找出來

按照異或運算的思路解題。假設這兩個數分別為A,B;將數組的每個元素異或運算一次,得到這兩個數的異或運算結果C,因為其他的數都是兩兩出現,異或運算的值為0,這個結果值C的二進位位中為1的位必只有A,B其中一個數有,因為異或運算就是不同的值才能得到1,相同的為0。即1&1=0;0&0=0;1&0=1。那麼我們就可以隨便從結果C中取出一個二進位位為1的位與其後面的0得到一個數,若結果C的二進位位後8位為00010100,那麼我們就可以得到4(二進位100),然後將數組中的每一個與4進行異或運算,這樣我們就能將數組分為兩組,A,B就被分到不同的組,其他的數被分到那個組並不用管,因為經過異或運算之後的值都為0,將兩組分別就行以後運算之後就能得到A,B的值了,其他的數都互相抵消了。

//3:給一個很大的數組,裡面有兩個數只出現過一次,其他數都出現過兩次,把這兩個數找出來void FindTwoNum(int* A,int size, int* first,int* second){    int excVal=A[0];    for(int i=1;i<size;i++)    {        excVal^=A[i];    }    int s1=1;    int s2=excVal;    while((s2&1)==0)    {        s2>>=1;        s1<<=1;    }    *first=excVal;    for(int i=0;i<size;i++)    {         if(s1&A[i])             *first^=A[i];    }    *second=excVal^*first;}void FindTwoNumTest(){    int A[12]={2,1,1,2,3,3,5,7,4,4,7,9};    int first=0,second=0;    FindTwoNum(A,12,&first,&second);    cout<<first<<endl;    cout<<second;}

三道簡單演算法題(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.