34. 在排序数组中查找元素的第一个和最后一个位置

71 阅读1分钟

34. 在排序数组中查找元素的第一个和最后一个位置

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

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

如果数组中不存在目标值 target,返回 [-1, -1]。
进阶: 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?

示例 1:

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

具体题目链接: 题目链接

思路:

思路:二分题目的思路: 确定二分边界(重点!!)
编写二分的代码框架
设计一个check(性质)
判断一下区间如何更新
如果更新方式写的是l=mid,r=mid-1,那么就在算mid的时候加上1

分析:

本题分别用二个模版
题意分析:在排序数组中查找元素的第一个和最后一个位置,目标值target

代码:

var searchRange = function(nums, target) {
    let res = [-1,-1];
    if(!nums)return res;

    // 计算第一个位置
    let left = 0;
    let right = nums.length-1;
    while(left<right) {
        let mid = left+right>>1;
        if(nums[mid]>=target) right=mid;
        else left = mid+1;
    }
    
    if(nums[left]!==target)return res;
    res[0] = left;

    //计算最后一个的
    left = 0;
    right = nums.length-1;
    while(left<right) {
        let mid = left+right+1 >>1;
        if(nums[mid]<=target)left = mid;
        else right =mid-1;
    }
    if(nums[left]!==target)return res;
    res[1] = left;
    
    return res;
};

总结:

这是算法系列文章「二分专题」的相关题解