leetcode 二分查找
时间: 2025-05-19 15:15:04 浏览: 17
### LeetCode 上二分查找算法的题目及其实现
#### 1. **35. 搜索插入位置**
此题的目标是在已排序数组中找到目标值应插入的位置,使得插入后数组仍然有序。可以通过调整左右指针来实现。
```java
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid; // 找到目标值返回索引
} else if (nums[mid] < target) {
left = mid + 1; // 目标值大于中间值,向右半部分搜索
} else {
right = mid - 1; // 目标值小于中间值,向左半部分搜索
}
}
return left; // 返回应该插入的位置
}
```
---
#### 2. **69. x 的平方根**
该问题通过寻找满足 `num * num <= x` 条件的最大整数值完成计算。这是经典的右端点查找问题[^1]。
```cpp
int mySqrt(int x) {
long long left = 0, right = x;
while (left <= right) {
long long mid = left + (right - left) / 2;
if (mid * mid <= x && (mid + 1) * (mid + 1) > x) {
return static_cast<int>(mid); // 找到了符合条件的结果
} else if (mid * mid < x) {
left = mid + 1; // 平方小于 x,继续增大范围
} else {
right = mid - 1; // 平方大于等于 x,缩小范围
}
}
return 0;
}
```
---
#### 3. **34. 在排序数组中查找元素的第一个和最后一个位置**
这道题需要分别查找目标值首次出现和最后一次出现的位置。可以利用两次二分查找分别定位两端点[^2]。
```python
def searchRange(nums, target):
def findBound(isFirst):
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
if isFirst:
if mid == 0 or nums[mid - 1] != target:
return mid
right = mid - 1
else:
if mid == len(nums) - 1 or nums[mid + 1] != target:
return mid
left = mid + 1
elif nums[mid] > target:
right = mid - 1
else:
left = mid + 1
return -1
first_pos = findBound(True)
last_pos = findBound(False)
return [first_pos, last_pos] if first_pos != -1 and last_pos != -1 else [-1, -1]
```
---
#### 4. **154. 寻找旋转排序数组中的最小值 II**
本题涉及重复元素的情况,在某些情况下可能无法直接排除一半区域,需额外考虑边界条件[^3]。
```c++
int findMin(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[right]) {
left = mid + 1; // 中间值较大,则最小值一定不在左侧
} else if (nums[mid] < nums[right]) {
right = mid; // 缩小区间至更小的一侧
} else {
--right; // 存在相等情况时逐步缩减右侧
}
}
return nums[left];
}
```
---
#### 5. **704. 二分查找**
最基础的二分查找实现方式如下所示:
```java
public int binarySearch(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid; // 成功匹配返回下标
} else if (nums[mid] < target) {
left = mid + 1; // 更新左界
} else {
right = mid - 1; // 更新右界
}
}
return -1; // 查找不到则返回 -1
}
```
---
#### 总结
以上展示了几个经典二分查找的应用场景及其具体实现方法。每种变体都基于基本框架进行了适当修改以适应特定需求[^4]。
相关问题
阅读全文
相关推荐

















