【二分查找】力扣 34. 在排序数组中查找元素的第一个和最后一个位置

一、题目

在这里插入图片描述

二、思路

将题目转化为求解 target 和 target + 1 的查找。分别采用最基础的二分查找即可。

三、题解

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int n = nums.length;
        int start = lowerBound(nums, target);
        if (start == n || nums[start] != target) {
            return new int[] {-1, -1};
        }
        // start 找到了,end 也一定存在,因此 end 无需检验
        int end = lowerBound(nums, target + 1) - 1;
        return new int[] {start, end};
    }


    /* 寻找大于等于 target 的第一个数,若存在 target 返回 left,即为第一个 target 的位置
        若有序数组中都是小于 target 的数,left 一直右移,最后 left = n,返回left,即为数组长度,tips: 返回的 left 不在下标范围内
        若有序数组中都是大于 target 的数,right 一直左移,left始终没有移动,最后 left = 0,tips: 返回的 left 在下标范围内,但所指向的数值与 target 不同
    */
    public int lowerBound(int[] nums, int target) {
        int n = nums.length;
        int left = 0, right = n - 1;
        while (left <= right) { // 区间不为空
            int mid = left + (right - left)/ 2; // java 防止溢出
            if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return left;// 最后结束时,right 在 left左边一个位置,right + 1 = left
                    // left - 1 永远指向的是红色,right + 1 永远指向的是蓝色,left的位置就是要找
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值