赞
踩
目录
二分查找是一种常见的算法,广泛应用于计算机科学领域。它的原理是通过不断将目标区间对半划分,从而迅速缩小查找范围。这种方法非常适用于在有序数组中查找特定元素。本篇文章详细解析了如何在有序整型数组中使用二分查找算法来查找目标值,并提供多个代码示例来帮助理解。
假设你有一个包含 n
个元素的升序整型数组 nums
,以及一个目标值 target
。你需要编写一个函数,在数组 nums
中搜索 target
,如果目标值存在则返回其下标,否则返回 -1
。
输入: nums = [-1,0,3,5,9,12]
, target = 9
输出: 4
解释: 9
出现在 nums
中并且下标为 4
输入: nums = [-1,0,3,5,9,12]
, target = 2
输出: -1
解释: 2
不存在 nums
中因此返回 -1
二分查找法利用了数组已经排好序(升序)的性质,通过每次将查找范围缩小一半,从而极大地提高了查找效率。算法的核心思想如下:
以下是实现二分查找的一种标准方法:
- public int search(int[] nums, int target) {
- int left = 0;
- int right = nums.length - 1;
-
- while (left <= right) {
- int mid = left + (right - left) / 2; // 防止溢出
- int x = nums[mid];
-
- if (x == target) {
- return mid;
- } else if (x > target) {
- right = mid - 1;
- } else {
- left = mid + 1;
- }
- }
- return -1;
- }
除了迭代方式,我们还可以采用递归方式实现二分查找:
- public int search(int[] nums, int target) {
- return binarySearch(nums, target, 0, nums.length - 1);
- }
-
- private int binarySearch(int[] nums, int target, int left, int right) {
- if (left > right) {
- return -1;
- }
-
- int mid = left + (right - left) / 2; // 防止溢出
- int x = nums[mid];
-
- if (x == target) {
- return mid;
- } else if (x > target) {
- return binarySearch(nums, target, left, mid - 1);
- } else {
- return binarySearch(nums, target, mid + 1, right);
- }
- }
有时我们可以进一步简化代码,使其更简洁:
- public int search(int[] nums, int target) {
- int left = 0;
- int right = nums.length - 1;
-
- while (left <= right) {
- int mid = (left + right) / 2;
-
- if (nums[mid] == target) {
- return mid;
- }
-
- if (nums[mid] < target) {
- left = mid + 1;
- } else {
- right = mid - 1;
- }
- }
- return -1;
- }
为了更好地理解算法,可以添加调试信息来跟踪程序执行过程:
- public int search(int[] nums, int target) {
- int left = 0;
- int right = nums.length - 1;
-
- while (left <= right) {
- int mid = left + (right - left) / 2;
- System.out.println("Left: " + left + ", Mid: " + mid + ", Right: " + right);
-
- if (nums[mid] == target) {
- System.out.println("Found target at index: " + mid);
- return mid;
- }
-
- if (nums[mid] < target) {
- left = mid + 1;
- } else {
- right = mid - 1;
- }
- }
- System.out.println("Target not found.");
- return -1;
- }
left
为数组的起始索引 0
,right
为数组的末尾索引 n-1
。mid
的索引,避免直接加和可能导致的溢出。target
比较:
right
更新为 mid - 1
。left
更新为 mid + 1
。left
超过 right
,表示目标值不在数组中,返回 -1
。二分查找是一种高效的查找算法,其时间复杂度为 O(log n)
,非常适用于大规模有序数组的查找任务。通过本文展示的多种实现方法,你可以灵活选择适合自己场景的实现方式。此外,理解并掌握二分查找的基本原理和细节,将会对提升你的编码能力和解决问题的效率大有裨益。希望这些方法能够帮助你顺利解决 java.util.concurrent.BrokenBarrierException
问题,确保程序顺利运行。
如果本文对你有帮助 欢迎 关注、点赞、收藏、评论!!!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/796069
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。