力扣完整代码二分查找
时间: 2025-04-29 14:51:17 浏览: 27
### LeetCode 二分查找完整代码实现
对于给定的有序数组 `nums` 和目标值 `target`,可以通过经典的二分查找算法来定位目标值的位置。以下是完整的 Java 实现:
```java
public class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = (right - left) / 2 + left; // 计算中间索引以防止溢出
if (target == nums[mid]) { // 找到目标返回其索引
return mid;
} else if (target < nums[mid]) { // 目标小于中间值,在左半部分继续查找
right = mid - 1;
} else if (target > nums[mid]) { // 目标大于中间值,在右半部分继续查找
left = mid + 1;
}
}
return -1; // 如果未找到则返回-1表示不存在该元素
}
}
```
此段代码展示了如何通过调整左右边界逐步缩小搜索范围直到找到目标或者确认目标不在列表中的过程[^2]。
为了进一步扩展应用,考虑一些变体问题如第一个错误版本或是在已排序数组中寻找两个数之和等于特定值的情况也可以采用类似的逻辑框架并做适当修改以适应具体需求[^3]。
#### 寻找左侧边界的二分查找
当题目要求找出某个条件成立的第一个位置时,则需要对上述标准形式稍作改动以便于处理这类情形:
```java
int binarySearchLeftBound(int[] nums, int target){
int left = 0 , right = nums.length ;
while(left<right){
int mid=(right-left)/2+left;
if(nums[mid]==target)
right=mid ;// 不立即返回而是收缩右侧边界尝试更早出现的目标
else if(nums[mid]<target)
left=mid+1;// 继续向右探索更大的可能解空间
else if(nums[mid]>target)
right=mid ;// 收缩右侧排除不可能区域
}
if(left==nums.length || nums[left]!=target)// 检查越界以及最终结果验证
return -1 ;
return left ;
}
```
这段代码实现了在存在重复项的情况下也能准确定位最左边匹配项的功能[^4]。
#### 应用于 Two Sum II 的解决方案
针对输入为升序排列数组求两数之和的问题,可以利用双指针加二分的思想快速得到答案:
```java
public int[] twoSum(int[] numbers, int target) {
for (int i = 0; i < numbers.length; ++i) {
int low = i + 1, high = numbers.length - 1;
while (low <= high) {
int mid = (high - low) / 2 + low;
if (numbers[mid] == target - numbers[i])
return new int[]{i + 1, mid + 1};
else if (numbers[mid] > target - numbers[i])
high = mid - 1;
else
low = mid + 1;
}
}
throw new IllegalArgumentException("No solution");
}
```
这里采用了固定一个数值作为基准再用另一个循环配合二分的方式高效解决问题。
阅读全文
相关推荐




















