45.遞減左旋數列中查詢一個數
阿新 • • 發佈:2019-01-28
題目:一個數組是由一個遞減數列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}克移兩位形成的,在這種陣列中查詢某一個數。
思路:在此序列不斷二分的過程中,由於原序列是一個遞減序列經過旋轉得到的,將它從任何位置分開,都會得到兩個序列,其中一個是遞減序列,另一個可以通過一個遞減序列通過旋轉得到。這樣在不斷地二分查詢時,我們處理的序列子片段要麼就是一個旋轉後遞減序列,要麼就是一個純遞減序列,而無論是前者還是後者,在繼續分成兩個片段時,至少有一個純遞減序列(可能兩個都是,如果之前的序列片段就是純遞減序列的話)。這樣我們可以保證能找到一個片段是純遞減序列(if(data[i]>=data[j])),然後判斷我們要找的數是否在這個片段中(這是很直觀的,if(data[i]<=num&&num<=data[j])),如果在則繼續在此片段中查詢,否則說明在另一個序列中,則遞迴在其中查詢
程式碼:
#include<iostream> using namespace std; int Find(int * a,int num,int left,int right) { if(a==NULL||left<0||right<0) return -1; if(left==right) { if(a[left]==num) return left; else return -1; } if(a[left]==num) return left; if(left>right) return -1; int mid=(left+right)/2; if(a[mid]==num) return mid; if(a[mid]<=a[left]) { if(num>a[mid]&&num<=a[left]) return Find(a,num,left,mid-1); else return Find(a,num,mid+1,right); } else { if(num<a[mid]&&num>=a[right]) return Find(a,num,mid+1,right); else return Find(a,num,left,mid-1); } } int main() { int arry[6]={4,3,2,1,6,5}; cout<<Find(arry,5,0,5)<<endl; }