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

给你一个按照非递减顺序排列的整数数组 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]

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

代码:

class Solution {
    public int[] searchRange(int[] nums, int target) {
        //处理空数组情况
        if(nums.length == 0)return new int[]{-1,-1};
        //第一步:查找target的起始位置(左边界)
        int l1 = 0,r1 = nums.length-1;
        while(l1<r1){
            //取中间位置
            int mid = l1+r1>>1;
            //目标在左侧,移动右边界
            if(nums[mid]>=target)r1 = mid;
            //目标在右侧,移动左边界
            else l1 = mid+1;
        }
        //循环结束后,l1和r1指向第一个可能等于target的位置
        //第二步:查找target的结束位置(右边界)
        int l2 = 0,r2 = nums.length-1;
        while(l2<r2){
            //中间位置偏向右侧
            int mid = l2+r2+1>>1;
            //目标在右侧,移动左边界
            if(nums[mid]<=target)l2 = mid;
            //目标在左侧,移动右边界
            else r2 = mid-1;
        }
        //循环结束后,l2和r2指向最后一个可能等于target的位置
        //检查是否找到target,未找到直接返回-1,-1
        if(nums[l1] != target&&nums[l2]!=target)return new int[]{-1,-1};
        //否则返回返回起始和结束位置
        else return new int[]{l1,l2};
    }
}
posted @ 2025-05-04 12:30  回忆、少年  阅读(15)  评论(0)    收藏  举报