算法:【二分查找】
二分模板
「二分」模板有两套,主要是根据 check(mid) 函数为 true 时,需要调整的是 l 指针还是 r 指针来判断。
- 当 check(mid) == true 调整的是 r 时:计算 mid 的方式应该为 mid = l + r >> 1:
long l = 0, r = 1000009; while (l < r) { long mid = l + r >> 1; if (check(mid)) { r = mid; } else { l = mid + 1; } } - 当 check(mid) == true 调整的是 l 时:计算 mid 的方式应该为 mid = l + r + 1 >> 1:
long l = 0, r = 1000009; while (l < r) { long mid = l + r + 1 >> 1; if (check(mid)) { l = mid; } else { r = mid - 1; } }1. 搜索旋转排序数组 II
输入:nums = [2,5,6,0,0,1,2], target = 0
输出:true
思路:
class Solution {
public boolean search(int[] nums, int target) {
if(nums.length == 0)
return false;
if(nums.length == 1)
return nums[0]==target;
int l=0, r=nums.length-1;
while(l <= r){
int mid = l + (r-l)/2;
if(nums[mid] == target){
return true;
}
if(nums[l] == nums[mid] && nums[mid] == nums[r]){
r--;
l++;
}else if(nums[mid] >= nums[l]){
if(target >= nums[l] && target < nums[mid]){
r = mid -1;
}else{
l = mid + 1;
}
}else{
if(target > nums[mid] && target <= nums[nums.length-1])
l = mid + 1;
else
r = mid -1;
}
}
return false;
}
}