整数数组nums按照升序有序,其中元素值各不相同。现在让nums前k个元素移动到数组末尾,如:k=3时,{0,1,2,4,5,6,7}变为{4,5,6,7,0,1,2}。在此时的数组当中查找元素值为target的元素,返回其下标,如果不存在返回-1。
思想:假设当前表下标范围为l....r,mid=(l+r)/2,则mid会将表分为有序的一边和无序的一边。根据有序部分的元素最大值和最小值判断target应该在左表还是右表。
代码:
int search(int nums[],int n,int target){
//处理特殊情况
if(n==0) return -1;
if(n==1) return (nums[0]==target)?0:-1;
int left=0,righ=n-1;
while(left<=righ){
int mid=(left+righ)/2;
if(nums[mid]==target){
return mid;//找到了
}
if(nums[left]<=nums[mid]){//左表有序
if(nums[left]<=target&&target<nums[mid]){//target在左表中
righ=mid-1;
}else{
left=mid+1;//target在右表中
}
}else{//右表有序
if(nums[mid]<target&&target<=nums[righ]){//target在右表中
left=mid+1;
}else{//target在左表中
righ=mid-1;
}
}
}
return -1;//没有这个元素
}
时间复杂度O(logn);空间复杂度O(1).