基本思想:
主要难在判定条件上;
采用二分拆分,mid必定可以把序列分为两半,一半递增,一般先递增后递减或者先递减后递增;
如果前半段递增:
target小于mid,且target大于首个元素,则说明target足够小在后半段,否则在前半段;
如果后半段递增:
target大于mid,切target大于最后的元素,则说明target足够大,且在前半段,否则在后半段;
注意一下边界条件,即全递减序列;
具体代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size()==0)
return -1;
int l=0,r=nums.size()-1;
while(l<r){
int mid=l+(r-l)/2;
if(nums[mid]==target)
return mid;
if(nums[0]<=nums[mid]){
//如果是递增序列,前半部分;
if(target<nums[mid]&&target>=nums[0]){
r=mid-1;
}else{
l=mid+1;
}
}else{
//如果后半部分是递增序列;
if(target>nums[mid]&&target<=nums[nums.size()-1]){
l=mid+1;
}else{
r=mid-1;
}
}
}
if(nums[l]!=target)
return -1;
else
return l;
}
};