在 Java 中使用**二分搜索(Binary Search)**时,有几个关键点和常见坑需要注意,尤其是用 Arrays.binarySearch 或自己手写实现时。
数组必须是有序的
int[] arr = {1, 3, 5, 7, 9}; // OK
Arrays.binarySearch 的注意事项int index = Arrays.binarySearch(arr, key);
index >= 0:找到元素,返回索引index < 0:未找到
-(index + 1)int[] arr = {1, 3, 5};
int i = Arrays.binarySearch(arr, 4); // i = -3
// 插入位置是 2
Comparable如果是对象数组:
Arrays.binarySearch(list, obj);
ComparableComparatorArrays.binarySearch(users, user, Comparator.comparing(User::getId));
如果排序用了 Comparator,二分也必须用同一个 Comparator
❌ 错误示例:
Arrays.sort(list, Comparator.reverseOrder());
Arrays.binarySearch(list, x); // 可能出错
✅ 正确:
Arrays.binarySearch(list, x, Comparator.reverseOrder());
常用写法:
while (left <= right)
而不是:
while (left < right) // 容易漏元素
int mid = left + (right - left) / 2;
不要用:
int mid = (left + right) / 2; // 可能溢出
if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
写错容易死循环或漏解。
标准二分只找一个位置,不保证是第一个或最后一个
| 问题 | 结果 |
|---|---|
| 数组未排序 | 结果错误 |
| 比较器不一致 | 结果错误 |
| 死循环 | 边界写错 |
| 找不到却直接用返回值 | 数组越界 |
TreeSet / TreeMap)如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。