1. 程式人生 > >45.遞減左旋數列中查詢一個數

45.遞減左旋數列中查詢一個數

題目:一個數組是由一個遞減數列左移若干位形成的,比如{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;
}