题意:给你一个数组,这个数组是由一个递增数组以某点为中心旋转而来的,然后让你找某个指定值得下标。
分析:暴力的话 n^2复杂度并没试过,但这道题一看就是用二分比较合适,毕竟原来是有序的。想法就是每次取这组数列的中心点作为分界线,左右两边至少会有一个数列是递增的,另一个则是与初始数组相同的旋转队列(先给出两个样例数据:[4,5,6,7,0,1,2],再给出一个[2,4,5,6,7,0,1],一个是中心两头都递增,一个是只有一个递增),所以套路就是先对其中递增数列进行二分查询,如果不在这里的话,就去另一个数列中查找,再找中点,重复一开始的过程:
AC:
class Solution {
public:
int search(vector<int>& nums, int target) {
int first=0;
int last=nums.size()-1;
int mid;
while(first<=last)
{
mid=first+(last-first)/2;
if(nums[mid]==target)
return mid;
if(nums[first]==target)
return first;
if(nums[last]==target)
return last;
if(nums[first]==nums[last])
return -1;
if(nums[first]<nums[mid])
{
if(target>nums[first]&&target<nums[mid])
last=mid-1;
else
first=mid+1;
}
else if(nums[first]>nums[mid])
{
if(target>nums[mid]&&target<nums[last])
first=mid+1;
else
last=mid-1;
}
else
return -1;
}
return -1;
}
};