返回
渐入佳境:LeetCode 34 算法指南,寻找排序数组中目标元素的边界
闲谈
2024-02-24 03:48:24
在算法世界中,搜索问题占据着至关重要的地位。在众多搜索算法中,二分查找算法以其卓越的效率脱颖而出。LeetCode 34 算法挑战要求我们运用二分查找算法,在排序数组中精确定位目标元素的第一个和最后一个位置。本指南将循序渐进地解析这一算法,帮助您轻松掌握它的奥秘。
前奏:二分查找算法
二分查找算法适用于已排序的数组,通过不断缩小搜索范围来快速定位目标元素。其基本思想是:将数组分成两半,判断目标元素可能存在于哪一半,然后继续在较小的那一半中执行同样的操作,直至找到目标元素或确定其不存在。
LeetCode 34 算法详解
LeetCode 34 算法的任务是在排序数组 nums
中查找目标元素 target
的第一个和最后一个位置。具体步骤如下:
-
初始化搜索范围 :将数组索引的左边界和右边界分别设为 0 和
nums.length - 1
。 -
循环二分查找 :
- 计算数组的中间索引
mid
。 - 比较
nums[mid]
和target
:- 如果
nums[mid] < target
,则目标元素一定在[mid + 1, right]
范围内,更新左边界为mid + 1
。 - 如果
nums[mid] > target
,则目标元素一定在[left, mid - 1]
范围内,更新右边界为mid - 1
。 - 如果
nums[mid] == target
,则我们找到了一个潜在的边界。记录当前mid
值,并同时在[left, mid - 1]
和[mid + 1, right]
范围内继续二分查找,以寻找目标元素的另一个边界。
- 如果
- 计算数组的中间索引
-
处理结果 :
- 如果找到了目标元素,则返回其第一个和最后一个位置。
- 如果没有找到目标元素,则返回
[-1, -1]
。
代码实现
以下是 LeetCode 34 算法的 Java 代码实现:
public int[] searchRange(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
int start = mid, end = mid;
while (start >= 0 && nums[start] == target) {
start--;
}
while (end < nums.length && nums[end] == target) {
end++;
}
return new int[]{start + 1, end - 1};
}
}
return new int[]{-1, -1};
}
拓展延伸
二分查找算法在实际应用中有着广泛的应用,例如:
- 二叉搜索树查找 :二分查找算法可以用来在二叉搜索树中高效地查找元素。
- 区间查询 :二分查找算法可以用于在排序数组中查找指定范围内的元素。
- 最大值最小值查询 :二分查找算法可以用于在排序数组中查找最大值或最小值。
结语
LeetCode 34 算法通过运用二分查找算法,为查找排序数组中目标元素的边界提供了一种高效的解决方案。本指南详细讲解了算法的步骤、代码实现以及实际应用,希望它能帮助您深刻理解这一经典算法。通过不断练习和探索,您一定能掌握二分查找算法的精髓,成为算法世界中的探险家。