返回
LeetCode 34:在升序数组中锁定目标值的踪迹
后端
2024-02-17 04:26:47
二分查找的精髓
二分查找是计算机科学中一种快速而有效的搜索算法,它反复将搜索范围对半分,直到找到目标值。这种方法基于数组是有序的前提,因此可以有效地缩小搜索范围。
LeetCode 34 问题要求我们在升序数组中找到目标值的第一个和最后一个位置。我们使用二分查找算法,首先将数组划分为左右两半,比较目标值与数组中间元素的大小。
public int[] searchRange(int[] nums, int target) {
int[] range = new int[]{-1, -1};
int left = 0;
int right = nums.length - 1;
// 查找目标值的第一个位置
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
range[0] = mid;
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
// 查找目标值的最后一个位置
left = 0;
right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
range[1] = mid;
left = mid + 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return range;
}
细致入微的边界处理
在二分查找算法中,边界条件的处理非常重要。为了避免数组越界,我们使用 while (left <= right)
作为循环条件。在查找目标值的第一个位置时,如果中间元素等于目标值,我们就将 right
更新为 mid - 1
,因为我们正在寻找第一个位置,所以我们需要在左边继续搜索。
在查找目标值的最后一个位置时,如果中间元素等于目标值,我们就将 left
更新为 mid + 1
,因为我们正在寻找最后一个位置,所以我们需要在右边继续搜索。
算法的复杂度分析
二分查找算法的时间复杂度为 O(log n),其中 n 是数组的长度。这是因为每次迭代都会将搜索范围缩小一半,因此搜索范围将呈指数级减少。
结语
LeetCode 34 问题的解决过程不仅锻炼了我们的算法思维,也加深了我们对二分查找算法的理解。这种算法的广泛应用性,使得掌握其原理和技巧变得尤为重要。希望本文能帮助您进一步掌握二分查找算法的精髓,并在未来的编程挑战中脱颖而出!