Suppose 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.
思路:
首先,可以第一句先考虑nums
为空的情况,这时候可以直接返回-1
。不过,也可以不考虑这种情况,而直接在程序最后当程序中间的return语句没有被执行,就最后return -1
.
然后,我们想到这道题可以采用Binary Search的思路。返回条件是:if(nums[mid] == target) return mid;
Binary Search具体是分为两层:第一层考虑first到mid这一段是否是sorted。第二层是如果first到mid这一段是sorted,那么再继续考虑target是否在first到mid这一段当中,如果在,就把mid赋给last,如果不在,就把mid + 1赋给first。如果first到mid这一段不是sorted,那么也跟前面类似地考虑target是否在mid到last - 1这一段当中,如果在就把mid + 1赋给first,如果不在,就把mid赋给last。这样就完成了Binary Search的每次折半搜索。最后,加一句返回语句,return -1
.
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.empty()) return -1;
int first = 0, last = nums.size();
while(first != last){
int mid = first + (last - first) / 2;
if(nums[mid] == target) return mid;
if(nums[first] <= nums[mid]){
if(nums[first] <= target && target < nums[mid])
last = mid;
else
first = mid + 1;
}else{
if(nums[mid] < target && target <= nums[last - 1])
first = mid + 1;
else
last = mid;
}
}
return -1;
}
};
Time : O(lgn)
Space: O(1)
相关题目。