题解 | #在旋转过的有序数组中寻找目标值#
在旋转过的有序数组中寻找目标值
https://www.nowcoder.com/practice/87c0e7abcbda41e7963660fa7d020995
int search(vector<int>& nums, int target) {
// write code here
int left=0,right=nums.size()-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]==target)
return mid;
if(nums[mid]<target){
if(nums[left]<nums[right])
left=mid+1; //left-right正序,二分查找
else{
if(nums[left]<nums[mid]) //left-mid正序,直接排除
left=mid+1;
else //left-mid不正序,那么mid-right肯定正序,要么在left-k(k<mid),要么在mid-right
{
if(nums[left]<=target) //肯定在left-k之间
right=mid-1;
else //肯定在mid+1-right之间
left=mid+1;
}
}
}
else{ //nums[mid]>target
if(nums[left]<nums[right])
right=mid-1; //left-right正序,二分查找
else{
if(nums[left]<nums[mid]) { //left-mid正序,可能在left-mid,可能在 k-right(k>mid)
if(nums[left]<=target) //肯定在left-mid里面
right=mid-1;
else //肯定在k-right里面
left=mid+1;
}
else //left-mid不正序,那么mid-right肯定正序,直接排除
right=mid-1;
}
}
}
return -1;
}
// write code here
int left=0,right=nums.size()-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]==target)
return mid;
if(nums[mid]<target){
if(nums[left]<nums[right])
left=mid+1; //left-right正序,二分查找
else{
if(nums[left]<nums[mid]) //left-mid正序,直接排除
left=mid+1;
else //left-mid不正序,那么mid-right肯定正序,要么在left-k(k<mid),要么在mid-right
{
if(nums[left]<=target) //肯定在left-k之间
right=mid-1;
else //肯定在mid+1-right之间
left=mid+1;
}
}
}
else{ //nums[mid]>target
if(nums[left]<nums[right])
right=mid-1; //left-right正序,二分查找
else{
if(nums[left]<nums[mid]) { //left-mid正序,可能在left-mid,可能在 k-right(k>mid)
if(nums[left]<=target) //肯定在left-mid里面
right=mid-1;
else //肯定在k-right里面
left=mid+1;
}
else //left-mid不正序,那么mid-right肯定正序,直接排除
right=mid-1;
}
}
}
return -1;
}