返回
LeetCode 探索之旅:深入 JavaScript 攻克第 33 到 34 题,掌握搜索区间算法精髓
前端
2024-02-09 04:01:16
算法简介:搜索区间
在 LeetCode 的算法天地中,搜索区间算法犹如一把利器,助您轻松找到目标值在有序数组中的位置范围。算法的核心思想是二分查找,它通过不断缩小搜索范围,快速定位目标值。
LeetCode 33:搜索旋转排序数组
LeetCode 33 题带您进入一个旋转排序数组的世界。在这个数组中,元素被旋转了某个未知的位置,就像一个圆环一样。您的任务是找到目标值在这个旋转数组中的起始位置和结束位置。
LeetCode 34:在排序数组中查找元素的第一个和最后一个位置
LeetCode 34 题延续了搜索区间算法的探索之旅,但这一次,您需要在有序数组中找到目标值出现的第一个和最后一个位置。在这个过程中,您将更加深入地理解二分查找算法的妙用。
JavaScript 解题思路
LeetCode 33:
- 将旋转数组视为两个有序数组的组合。
- 找到旋转点,即数组被旋转的位置。
- 在两个有序数组中分别使用二分查找算法搜索目标值。
LeetCode 34:
- 使用二分查找算法找到目标值在有序数组中的位置。
- 向左和向右扩展搜索范围,直到找到目标值的第一个和最后一个位置。
代码实现:
LeetCode 33:
function search(nums, target) {
let left = 0, right = nums.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (nums[mid] === target) {
// 搜索目标值左侧边界
let start = mid - 1;
while (start >= 0 && nums[start] === target) {
start--;
}
// 搜索目标值右侧边界
let end = mid + 1;
while (end < nums.length && nums[end] === target) {
end++;
}
return [start + 1, end - 1];
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return [-1, -1];
}
LeetCode 34:
function searchRange(nums, target) {
let left = 0, right = nums.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (nums[mid] === target) {
// 搜索目标值左侧边界
let start = mid - 1;
while (start >= 0 && nums[start] === target) {
start--;
}
// 搜索目标值右侧边界
let end = mid + 1;
while (end < nums.length && nums[end] === target) {
end++;
}
return [start + 1, end - 1];
} else if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return [-1, -1];
}
总结
通过 LeetCode 33 和 34 题的探索,您已掌握了搜索区间算法的精髓。在未来的 LeetCode 征途上,您将不断磨砺算法技能,不断突破编程的界限。
希望这篇文章能为您的 LeetCode 之旅增添光彩。让我们一起在算法的世界中乘风破浪,不断超越自我!