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.
思路一:先顺序遍历找到pivot,如果没有找到满足target的值,那么在对剩下的升序序列使用二分搜索
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int len = nums.size();
int front,end,middle;
end = len-1;front=0;
for(int i=0;i<len-1;i++)
{
if(target == nums[i])
return i;
if(nums[i]>nums[i+1])
{
front = i+1;
break;
}
}
while(front<=end)
{
middle = (front+end)/2;
if(nums[middle]>target)
{
end = middle-1;
}
else if(nums[middle] < target)
{
front = middle+1;
}
else
{
return middle;
}
}
return -1;
}
};
运行的时候效率不是很稳定
思路二:整个过程都使用二分搜索法
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int len = nums.size();
int flag = nums[len-1];
int front,end,middle;
end = len-1;front=0;
while(front<end)
{
middle = (front+end)/2;
if(nums[middle] <= nums[end])
{
if(target > nums[middle] && target <= nums[end])
front = middle+1;
else
end = middle;
}
else
{
if(target <= nums[middle] && target >= nums[front])
end = middle;
else
front = middle+1;
}
}
if(nums[front]==target)
return front;
return -1;
}
};
思路三:求出那个pivot的位置,然后就可以将每个middle转换为原先没有rotated的数组中对应的位置
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int len = nums.size();
int front,end,middle;
end = len-1;front=0;
while(front<end)
{
middle = (front+end)/2;
if(nums[middle] == target)
return middle;
if(nums[middle] > nums[end])
front = middle+1;
else
end = middle;
}
int smallest = front;
front = 0;end = len-1;
while(front<=end)
{
middle = (front+end)/2;
int realmiddle = (middle+smallest)%len;
if(nums[realmiddle]>target)
{
end = middle-1;
}
else if(nums[realmiddle] < target)
{
front = middle+1;
}
else
{
return realmiddle;
}
}
return -1;
}
};