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.
解法一:顺序检索,3ms AC,属于最快的那一波解法,想不到想不到。。。。
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size() == 0)
return -1;
for(int i=0;i<nums.size();i++)
{
if(nums[i] == target)
return i;
}
return -1;
}
};
解法二:二分检索,先找出最小值(也就是翻转的那个下标),然后根据target的大小,分两段二分检索。9ms,震惊,居然很慢。。。
class Solution {
public:
int search(vector<int>& nums, int target)
{
int len = nums.size();
int left = 0, right = len-1;
if(nums.size() == 0)
return -1;
while(left < right)
{
int mid = (left+right)/2;
if(nums[mid] > nums[right])
left = mid+1;
else
right = mid;
}
//当 left=right 时,找到了最小值,也就是翻转的位置
int rotate = left;
cout<<rotate<<endl;
if(target > nums[len-1])//在左半部分
{
left = 0; right = rotate-1;
}
else
{
left = rotate; right = len-1;
}
while(left <= right) //处理只有一个元素的情况
{
int mid = (left+right)/2;
if(nums[mid] == target)
return mid;
else if(nums[mid] > target)
right = mid-1;
else
left = mid+1;
}
return -1;
}
};