2019.2.11
题目描述:
Suppose an array sorted in ascending order 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.
Your algorithm's runtime complexity must be in the order of O(log n).
Example 1:
Input: nums = [4,5,6,7,0,1,2], target = 0 Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2], target = 3 Output: -1
这题其实就是查询在数组中是否有target值,不过该题有个要求是时间复杂度必须是O(log n),而且该数组有规律,是原来的升序数组经过某个点旋转得来的。
解法一:
其实既然要求时间复杂度为O(log n),那我们就能够想到这可能要使用二分法了。我们思考一下,既然该数组是由原来的升序数组经过某个点旋转得来的,那么我们将该数组一分为二,那么必然存在某个区域是有序的,而另一个区域内是无序的如[1,2,4,5,6,7,0],target=3,一分为二之后,左半边是有序的,而右半边是无序的,而nums[mid]=5是大于三的,那么显然target是在左半边的,那么右半边就可以省去了,也就是利用了二分法的思想。
C++代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int low=0,high=nums.size()-1;
while(low<=high){
int mid=low+(high-low)/2;
if(nums[mid]==target) return mid;
else if(nums[mid]<nums[high]){
if(nums[mid]<target&&nums[high]>=target)
low=mid+1;
else
high=mid-1;
}
else{
if(nums[low]<=target&&nums[mid]>target)
high=mid-1;
else
low=mid+1;
}
}
return -1;
}
};