这题是一道二分查找的变形题,数组在一个区间内有序;那么思路很简单,找到这个边界,如果在0~k范围内找到了,就在这个区间内二分查找,如果在[k+1,end]内找到了,就在这里二分查找,如果在范围外,返回-1;
四路上很简单,细节上要注意的问题很多;
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size()==1&&nums[0]!=target) return -1;
int k=nums.size()-1;
for(int i=0;i<nums.size()-1;i++)
{
if(nums[i]>nums[i+1])
{
k=i;
break;
}//找边界
}
int left,right;
if(k==nums.size()-1)//如果没换,就执行这个方案
{
left=0;
right=k;
}
else//如果换了,就执行这个方案
{
if(nums[0]<=target&&nums[k]>=target)
{
left=0;right=k;
}
else if(nums[k+1]<=target&&nums.back()>=target)
{
left=k+1;right=nums.size()-1;
}
else if(nums[k]<target||nums[k+1]>target)
{
return -1;
}
}
while(left<=right)//二分查找经典代码
{
int mid=left+(right-left)/2;
{
if(nums[mid]==target)
{
return mid;
}
else if(nums[mid]<target)
{
left=mid+1;
}
else if(nums[mid]>target)
{
right=mid-1;
}
}
}
return -1;
}
};