这是题目:
对于有序数组,借助二分查找的方法来解决。因为旋转之后会有一半是有序的,局部有序也用二分查找。其实是一种分治的思想,把搜索的范围变小。
将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环.
int search(vector<int> &nums,int target)
{
int n=(int)nums.size();
if(!n) return -1; //为空执行
//只有一个元素
if(n==1) return target==nums[0] ? 0: -1;
int low=0,high=n-1;
while(low<=high)
{
int mid=(low+high)/2;
if(target==nums[mid]) return mid;
//如果有序的是前一半
if(nums[0]<=nums[mid]){
if(nums[0]<=target &&target<nums[mid]){
high=mid-1;
}else{
low=mid+1;
}
}//否则有序的是后一半
else{
if(nums[mid]<target &&target<=nums[n-1])
{
low=mid+1;
}else{
high=mid-1;
}
}
}
return -1;
}
下面是经典的二分查找
```cpp
int search_binary(vector<int> &nums,int value)
{
int low=0;
int high=nums.size()-1;
int mid=(low+high)/2;
while(low<=high)
{
if(nums[mid]==value)
{
return mid;
}
else if(value<nums[mid])
{
high=mid-1;
}
else{
low=mid+1;
}
mid=(low+high)/2;
}
return -1;
}