uppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
================
二分搜索
解决思路:
/**
012 3 4567
701 2 3456
670 1 2345
567 0 1234
456 7 0123
345 6 7012
234 5 6701
123 4 5670
*/
可以看到数组旋转的各种情况,mid将数组分为左右两部分
nums[mid]<nums[right],那么右边的部分是有序的
因为右边部分有序,那么我可以在有序的部分判断:是否存在target值;如果有序的部分不存在target,那么在数组的左边部分寻找。
我觉得这左右两部分的判断条件是不等价的,我们只能用排除法,先在有把握的部分搜索,这部分能找到更好。不能找到呢,换成另外的部分。
如果nums[mid] > nums[left],那么左边的部分是有序的。
我们再在有序的部分寻找。。。。。
int search(const vector<int> &nums,int target){ if(nums.size()==0)return -1; int left = 0; int right = nums.size()-1; while(left<=right){ int mid = (left+right)/2; if(nums[mid]==target) return mid; else if(nums[mid]<nums[right]){ ///the right part is sorted if(nums[mid]<target && nums[right]>=target) left = mid+1; else right = mid-1; }else{ ///the left part is sorted if(nums[mid]>target && nums[left]<=target) right = mid-1; else left = mid+1; } }///while return -1; }