在部分有序数组中查找定值2

描述:给定一个有序数组,数组中可重复出现相同数字,然后数组经过旋转后,如{0,1,1,2,2,3,4,4,5,6}旋转后{4,5,6,0,1,1,2,2,3,4};在旋转后的数组中查找给定值key,并返回数组中key值索引,否则返回-1。

思路一:依然使用暴力查找方法,依次从数组首部遍历至尾部,若查找到key值后,返回第一次出现的索引,否则返回-1;

class Solution{
public:
	int search(int A[],int n,int value)
	{
		if(n<1)return -1;
		for(int i=0;i<n;i++)
		{
			if(A[i]==value)
			return i;
		}
		return -1;
	}
}; 
思路二:依然使用二分法,A[mid]与A[first]共有三种大小关系,1.当A[first]<A[mid]时,能保证[first,mid]是递增序列,如{0,1,1,2,2,3,4,4,5,6};2.当A[first]>A[mid]时,能保证[mid,last]是递增序列,如{4,5,6,0,1,1,2,2,3,4};3.当A[first]=A[mid]时,则有两种情况,如{4,4,4,4,4,1,2,2,3,4}或{4,5,6,0,4,4,4,4,4,4},则缩小区间范围,令first++或last--;

class Solution{
public:
	int search(int A[],int n,int value)
	{
		if(n<1)return -1;
		int first=0;
		int last=n-1;
		while(first!=last)
		{
			int mid=first+(last-first)/2;
			if(A[first]<A[mid])//情况1:[first,mid]递增有序 
			{
				if(A[first]<=value&&A[mid]>value)
				{
					last=mid-1;
				 } 
				 else
				 {
				 	first=mid+1;
				 }
			}
			else if(A[first]>A[mid])//情况2:[mid,last]递增有序
			{
				if(A[mid]<value&&value<=A[last])
				{
					first=mid+1;
				}
				else
				{
					last=mid-1;
				}
			 } 
			 else//情况3:两种缩小范围方案 
			 {
			 	first++;//or last--; 
			 }
		}
		return -1; 
	}
}; 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值