解题思路
局部有序,同样可以使用二分查找
将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。
此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环。
- 1.找一个中值mid把数组分成[left,mid][mid+1,right]两部分,肯定有一部分是有序的;
- 2.如果左边是有序的,目标值小于等于num[0]且小于中值时,说明目标值在这段有序数内,右边界 为mid - 1,否则在另一端left = mid + 1
- 3.如果右边是有序的,目标值大于中值且小于等于num[len-1]时,说明目标值在这段有序数内,左边 界为left = mid + 1,否则在另一端mid - 1
代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int len = (int)nums.size();
if(!len){
return -1;
}
if(len == 1){
return nums[0] == target? 0 : -1;
}
int left = 0;
int right = len - 1;
while(left <= right){
int mid = (left + right)/2;
if(nums[mid] == target){
return mid;
}
if(nums[0]<= nums[mid]){
if(nums[0]<=target && target < nums[mid]){
right = mid - 1;
}else{
left = mid + 1;
}
}
else{
if(nums[mid]<target && target <= nums[len-1] ){
left = mid + 1;
}else{
right = mid - 1;
}
}
}
return -1;
}
};