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

在这里插入图片描述

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] result = {-1, -1};

        int leftIndex = findPosition(nums, target, true);
        /*
         * 1、因为①的条件为low <= high,所以返回的左边的下标一定是大于high的,
         *    如果high没动过,那么low最后就等于nums.length,说明数组中没有target。
         *    为什么还要多加个leftIndex == nums.length判断?因为此时nums[leftIndex]
         *    会报索引越界异常。
         * 2、如果nums[leftIndex]不等于target,说明数组中没有target。
         * */
        if (leftIndex == nums.length || nums[leftIndex] != target) {
            return result;
        }
        //计算target的右边的下标。(为什么要减一可以自己手动算一下。)
        int rightIndex = findPosition(nums, target, false) - 1;
        result[0]=leftIndex;
        result[1]=rightIndex;
        return result;
    }

    /*
     * left参数的引入,指示我们在遇到target==nums[mid]
     * 时应该做什么。如果left为true,那么我们递归查询左区间,
     * 否则递归右区间。
     * */
    public int findPosition(int[] nums, int target, boolean left) {
        int low = 0;
        int high = nums.length - 1;
        //①跳出循环的条件:low <= high
        while (low <= high) {
            int mid = (low + high) >> 1;
            //target小于nums[mid]时,查询左区间
            //target等于nums[mid],且left为true时,查询左区间
            if (target < nums[mid] || (left && nums[mid] == target)) {
                high = mid - 1;
            }
            /*
             * 出现else的情况:
             * 1、target大于nums[mid]
             * 2、target等于nums[mid]但是left为false
             * */
            else {
                low = mid + 1;
            }
        }
        return low; //返回的是low,所以要对low进行判断
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值