【100題】第四十八題 移位元組的二分尋找

來源:互聯網
上載者:User

一,題目

        一個數組是由一個遞減數列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移兩位形成的,在這種數組中尋找某一個數。


二,分析

        1)在此序列不斷二分的過程中,由於原序列是一個遞減序列經過旋轉得到的,將它從任何位置分開,都會得到兩個序列,

                               其中一個是遞減序列

                               另一個可以通過一個遞減序列通過旋轉得到。

        2)這樣在不斷地二分尋找時,我們處理的序列子片段要麼就是一個旋轉後遞減序列,要麼就是一個純遞減序列,

        3)無論是前者還是後者,在繼續分成兩個片段時,至少有一個純遞減序列(可能兩個都是,如果之前的序列片段就是純遞減序列的話)。

        4)這樣我們可以保證能找到一個片段是純遞減序列(if(data[i]>=data[j]))

        5)然後判斷我們要找的數是否在這個片段中(這是很直觀的,if(data[i]<=num&&num<=data[j])),如果在則繼續在此片段中尋找,否則說明在另一個序列中,則遞迴在其中尋找

三,源碼

#include<iostream>using namespace std;int bisearch(int a[],int left,int right,int num){ if(a==NULL||right<0)          return -1;      if(left==right)//還剩下一個值的時候     {          if(a[left]==num)              return left;          else              return -1;      }        //int mid=(left+right)/2;   int mid=left+(right-left)/2;      if(a[mid]==num)       return mid;          if(a[mid]<=a[left])//左側純遞減    {       if(num>a[mid]&&num<=a[left]) //左側             return bisearch(a,left,mid-1,num);       else           return bisearch(a,mid+1,right,num);   }   else    //右側純遞減    {      if(num>=a[right]&&num<a[mid]) //右側       return bisearch(a,mid+1,right,num);    else     return bisearch(a,left,mid-1,num);   }}int main(){ int a[100]={4,3,2,1,6,5};    cout<<bisearch(a,0,5,6)<<endl; return 0;}

 


 

 

聯繫我們

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