/**
* @author
* @Date 2023/5/9 23:39
*/
public class Solution {
/**
* 二分法模版 必须背过
*/
public int binarySearch(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int start = 0, end = nums.length - 1;
// 用 start+ 1< end 而不是 start < end 的目的是为了避免死循环
// 在 first position of target 的情况下不会出现死循环
// 但是在 last position 的情况下会出现死循环
// 样例 : nums = [1,1] ,target = 1
// 为了🙆统一模版,我们就都采用 start + 1 < end 就保证不会出现死循环
while (start + 1 < end) {
// python 没有 overflow 的问题 直接 // 2 就可以了
// java 和 C++ 最好写成 mid = start + (end - start) /2
// 防止在 start = 2^31 -1, end = 2^31 -1 的情况下出现加法 overflow
int mid = start + (end - start) / 2;
// > , = , < 的逻辑先分开写, 然后在看看 = 的情况是否能合并到其他分支里
if (nums[mid] < target) {
// 写作 start = mid +1 也是正确的
// 只是可以偷懒不写, 因为不写也没问题 不会影响时间复杂度
// 不写的好处是 万一你不小心写成了 mid -1 你就错了
start = mid;
} else if (nums[mid] == target) {
end = mid;
} else {
// 写作 end = mid -1 也是正确的
// 只是可以偷懒不写 因为不写也没问题 不会影响时间复杂度
// 不写的好处是,万一你不小心写成了 mid - 1 你就错了
end = mid;
}
}
// 因为上面的循环退出条件是 start+1 < end
// 因此这里循环结束的时候 start 和end 的关系是相邻关系(1 和 2 ,3 和 4 这种)
// 因此需要再单独判断 start 和 end 这两个数谁是我们要的答案
// 如果是找 first position of target 就先看 start, 否则就看 end
if (nums[start] == target) {
return start;
}
if (nums[end] == target) {
return end;
}
return -1;
}
}
二分法--模版--必须背过
最新推荐文章于 2024-09-22 20:09:34 发布
文章提供了一个Java实现的二分查找算法,强调了避免死循环的处理方式,特别是在数组中目标值出现多次的情况。代码中通过确保`start+1<end`作为循环条件来防止特定边界问题,并对更新`start`和`end`的策略进行了说明。
摘要由CSDN通过智能技术生成