二分查找
1. 标准的二分查找
即从两边一步一步的向中间靠拢,查找指定的某一个值
public boolean binarySearch(int[] nums, int target) {
int start = 0, end = nums.length - 1;
while(start <= end){
int mid = (start + end) / 2;
if(nums[mid] == target){
return true;
} else if(nums[mid] < target){
start = mid + 1;
} else {
end = mid - 1;
}
}
return false;
}
2. 查找小于等于指定值的最大值,大于等于指定值的最小值
小于等于指定值的最大值
public int binarySearch(int[] nums, int target) {
int start = 0, end = nums.length - 1;
while(start < end){
int mid = (start + end + 1) / 2;
if(nums[mid] > target){
end = mid - 1;
} else {
start = mid;
}
}
if(nums[start] > target){
return -1;
}
return start;
}
注意:
- 为什么 start < end,并且 mid = (start + end + 1) / 2;
. . . . . . 3 6 . . . . . . . . . k k + 1 . . . 假设查询小于等于 5 的最大值,此时 start = k,end = k + 1;若 mid = (start + end)/ 2;则程序陷入死循环,改成 mid = (start + end + 1) / 2;则可以取到索引较大的那一项。
当 start 等于 end 的时候,即为可能的答案。
- 若无解,则循环结束之后 start 仍未发生改变。
大于等于指定值的最小值
public int binarySearch(int[] nums, int target) {
int start = 0, end = nums.length - 1;
while(start < end){
int mid = (start + end) / 2;
if(nums[mid] < target){
start = mid + 1;
} else {
end = mid;
}
}
if(nums[end] < target){
return -1;
}
return start;
}
分析同上,计算中值的时候同样避免了死循环。