要求:找target
思路:二分
不完全二分,以rightleft判断
class Solution {
public:
int search(vector<int>& nums, int target) {
int n=nums.size();
int left=0,right=n-1;
while(left<=right){
int mid=left+(right-left>>1);
if(nums[mid]==target)return mid;
else if(nums[mid]>target){
if(nums[left]<target)right=mid-1;
else if(nums[left]>target)++left;//在右边,但mid大于不能跳过
else return left;
}
else if(nums[mid]<target){
if(nums[right]<target)--right;//在左边,但mid小于不能跳过
else if(nums[right]>target)left=mid+1;
else return right;
}
}
return -1;
}
};
完全二分,以0和n-1判断
class Solution {
public:
int search(vector<int>& nums, int target) {
int n=nums.size();
int left=0,right=n-1;
while(left<=right){
int mid=left+(right-left>>1);
if(nums[mid]==target)return mid;
if (nums[0] <= nums[mid]) {//mid在左边
if (nums[0] <= target && target < nums[mid]) {//target也在左边,[0,mid-1]
right = mid - 1;
} else {
left = mid + 1;
}
} else {//mid在右边
if (nums[mid] < target && target <= nums[n - 1]) {//target也在右边,[mid+1,end]
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1;
}
};