力扣刷题:在排序数组中查找元素的第一个和最后一个位置

题目:

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]。

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8

输出:[3,4]

示例 2:

输入:nums = [5,7,7,8,8,10], target = 6

输出:[-1,-1]

示例 3:

输入:nums = [], target = 0

输出:[-1,-1]

解析:

由于题目对时间复杂度的限制,在这里使用二分查找的思路更加的方便,这里与二分查找略微不同,需要设置一个index表示向左或者向右的边界情况,index代表了左右边界的索引

具体代码:

javascript 复制代码
/**
 * 在已排序数组中查找目标值的起始和结束位置
 * @param {number[]} nums - 已排序的升序数组
 * @param {number} target - 要查找的目标值
 * @return {number[]} - 返回包含起始和结束位置的数组,如果未找到则返回[-1, -1]
 */
var searchRange = function(nums, target) {
    // 查找目标值的左边界(第一次出现的位置)
    let left = search(nums, target, true);
    // 查找目标值的右边界(最后一次出现的位置)
    let right = search(nums, target, false);
    // 返回结果数组
    return [left, right];
};

/**
 * 二分查找辅助函数,用于查找目标值的边界
 * @param {number[]} nums - 已排序的升序数组
 * @param {number} target - 要查找的目标值
 * @param {boolean} isLeft - 标识查找的是左边界(true)还是右边界(false)
 * @return {number} - 返回找到的边界索引,未找到则返回-1
 */
function search(nums, target, isLeft) {
    // 初始化二分查找的左右指针
    let left = 0;
    let right = nums.length - 1;
    // 初始化结果索引为-1(表示未找到)
    let index = -1;
    
    // 二分查找主循环
    while (left <= right) {
        // 计算中间索引
        let mid = Math.floor((left + right) / 2);
        
        if (nums[mid] > target) {
            // 中间值大于目标值,在左半部分继续查找
            right = mid - 1;
        } else if (nums[mid] < target) {
            // 中间值小于目标值,在右半部分继续查找
            left = mid + 1;
        } else {
            // 找到目标值,记录当前索引
            index = mid;
            
            if (isLeft) {
                // 如果是查找左边界,继续在左半部分查找更早出现的位置
                right = mid - 1;
            } else {
                // 如果是查找右边界,继续在右半部分查找更晚出现的位置
                left = mid + 1;
            }
        }
    }
    
    // 返回找到的边界索引(如果未找到则为-1)
    return index;
}
相关推荐
某林2123 小时前
基于SLAM Toolbox的移动机器人激光建图算法原理与工程实现
stm32·嵌入式硬件·算法·slam
修炼地3 小时前
代码随想录算法训练营第四十三天 | 图论理论基础、深搜理论基础、卡码网98. 所有可达路径、797. 所有可能的路径、广搜理论基础
算法·深度优先·图论
iAkuya3 小时前
(leetcode)力扣100 23反转链表(迭代||递归)
算法·leetcode·链表
剪一朵云爱着3 小时前
PAT 1095 Cars on Campus
算法·pat考试
LBJ辉4 小时前
第 4 章 串
数据结构·考研
MicroTech20254 小时前
激光点云快速配准算法创新突破,MLGO微算法科技发布革命性点云配准算法技术
人工智能·科技·算法
Cathy Bryant4 小时前
傅里叶变换(一):简介
笔记·算法·数学建模·信息与通信·傅里叶分析
allan bull5 小时前
在节日中寻找平衡:圣诞的欢乐与传统节日的温情
人工智能·学习·算法·职场和发展·生活·求职招聘·节日
似水এ᭄往昔5 小时前
【C++】--封装红⿊树实现mymap和myset
开发语言·数据结构·c++·算法·stl