LeetCode 33.搜索旋转排序数组
二分法
将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。
此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环.
eg:
nums=[4,5,6,7,0,1,2],target = 0
4 | 5 | 6 | 7 | 0 | 1 | 2 | |
---|---|---|---|---|---|---|---|
left | l0 | l1,2 | |||||
right | r2 | r0,r1 | |||||
mid | m0 | m2 | m1 |
完整代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0,right = nums.size()-1;
while(left <= right) // 必须有等号
{
int mid = (right - left)/2 + left;
if(nums[mid] == target)
return mid;
if(nums[0] <= nums[mid]) // 如果mid左边递增
{
if(nums[0] <= target && target < nums[mid]) // 如果target在左边递增区间
right = mid-1;
else
left = mid+1;
}
else // else mid右边递增或者无序
{
if(nums[mid]<target && target<=nums[nums.size()-1])
left = mid+1;
else
right = mid-1;
}
}
return -1;
}
};