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

问题:

记录自己 看完 代码随想录 34讲解的一些想法

解决:

class Solution{


    public int[] searchRange(int[] nums, int target){

    int rightBorder = RightBorder(nums,target);
    int leftBorder = LeftBorder(nums,target);

    if(rightBorder == -2 || leftBorder == -2) return new int[] {-1,-1};

    /*
    为什么这里条件要这样设置
    因为后面的代码是
    left = mid + 1;
    rightBorder = mid;

    right =  mid - 1;
    leftBorder =  mid;

    因为这里是用的mid + 1和mid-1后的值
    因为int []nums={5,7,7,8,8,10};
    例如上述情况,最后mid的值分别为3,4
    4-3 = 1 就会错误判断成 不符合的情况
     
     当用rightBorder 和 leftBorder的值
     rightBorder - leftBorder =  1 直接可以判断为不符合情况
     这样可以省很多事
     
     */
    if(rightBorder - leftBorder > 1) return new int[] {leftBorder,rightBorder};

    //if(rightBorder - leftBorder = 1) return new int[] {-1,-1};
    return new  int[] {-1,-1};

    }


    //右边界
    public int RightBorder(int[] nums, int target){
        int rightBorder = -2;

        int  left = 0;
        int right = nums.length - 1;

        while (left <= right){
            int mid = (left+right) / 2;

            if(nums[mid] > target){
                right = mid - 1;
            }else {
                left = mid + 1;
                rightBorder = mid;
            }

        }
        return rightBorder;
    }


    public int LeftBorder(int[] nums, int target) {
        int leftBorder = -2;

        int left = 0;
        int right = nums.length - 1;

        while (left <= right){
            int mid = (left + right) / 2;
            if(nums[mid] >= target){
                right =  mid - 1;
                leftBorder =  mid;
            }else {
                left = mid+1;
            }
        }

        return leftBorder;
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值