参考: https://yq.aliyun.com/articles/3888
题意
在有序的旋转数组中查找目标值(旋转有序指:一个数组被分割成两个有序的区间,且两区间能相连成一个有序的大区间。如45123)
题解
应为任意一个点分割的两个区间至少有一个是有序的,所以可以使用二分查找的方法解决。
注:由于有序数组中可能会有重复的数字,如113111,如果nums[mid] == nums[i],只要将i+1即可。
代码
class Solution {
public:
bool search(vector<int>& nums, int target) {
int i = 0, j = nums.size() - 1;
while(i <= j)
{
int mid = (i + j) / 2;
if(nums[mid] == target)
return true;
else if(nums[mid] > nums[i]) // 确定的有序区间在左边
{
if(nums[i] <= target && target <= nums[mid]) //若target在此有序区间中
j = mid;
else
i = mid + 1;
}
else if(nums[mid] < nums[i]) //确定的有序区间在右边
{
if(nums[mid] <= target && target <= nums[j])
i = mid;
else
j = mid - 1;
}
else
i++;
}
return false;
}
};