34.在排序数组中查找元素的第一个和最后一个位置--leetcode算法题解(带注释)

public int[] searchRange(int[] nums, int target) {
        //先决条件排除一部分
        if(target < nums[0] || target > nums[nums.length - 1]){
            return new int[]{-1,-1};
        }
        //初始化左右边界
        int l = 0;
        int r = nums.length - 1;
        //初始化数组
        int[] arr = {-1,-1};
        int mid = 0;
        //代表左边界是否有被找到
        boolean canBeFound = false;
        //找arr[0] 也就是左边界
        while(l <= r){
            //二分法求左边界
            mid = l + (r - l) / 2;
            if(target == nums[mid]){
                //告诉下面我找到了左边界
                canBeFound = true;
                r = mid - 1;
                //赋值
                arr[0] = mid;
                //如果r经过减一之后小于0,说明到达原数组边界
                if(r < 0){
                    break;
                }
                //如果这个数的左边那个数比自己小,说明找到了边界
                if(nums[r] < nums[mid]){
                    break;
                }
            }
            //正常操作
            if(target < nums[mid]){
                r = mid - 1;
            }
            if(target > nums[mid]){
                l = mid + 1;
            }
        }

        if(!canBeFound){
            //找不到左边界
            return arr;
        }

        //reset l and r
        l = mid;
        r = nums.length - 1;
        //找右边界,和上面对称即可
        while(l <= r){
            mid = l + (r - l) / 2;
            if(target == nums[mid]){
                l = mid + 1;
                arr[1] = mid;
                if(l >= nums.length){
                    break;
                }
                if(nums[l] > nums[mid]){
                    break;
                }
            }
            if(target < nums[mid]){
                r = mid - 1;
            }
            if(target > nums[mid]){
                l = mid + 1;
            }
        }
        return arr;
    }

其实还有一种方法是一个while里把左右边界都找出来,这个初次写可能会比较乱,我也还没搞懂,就这样先了,好歹也是手撸出来的,上面的算法。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值