题目如下:
解题思路:
由于题目对于时间复杂度的要求为 O(log n) 级别,所以直接思路就是采用二分搜索。对于旋转排序数组,可以发现:
- 如果中间的数小于最右边的数组元素,则右半段是有序的;
- 如果中间的数大于最右边的数组元素,则左半段是有序的;
只要在有序的半段里用首尾两个数组元素来判断目标值是否在这一区域内,这样就可以确定保留哪半边。
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0, r = nums.size() - 1;
//二分查找
while(l <= r)
{
int mid = (l + r) / 2;
if(nums[mid] == target)
return mid;
//右半边有序
if(nums[mid] < nums[r])
{
if(nums[mid] < target && nums[r] >= target)
l = mid + 1;
else
r = mid - 1;
}
//左半边有序
else
{
if(nums[l] <= target && nums[mid] > target)
r = mid - 1;
else
l = mid + 1;
}
}
return -1;
}
};