LeetCode第34题,在排序数组中查找的第一个和最后一个元素,Java,二分查找

问题:

思路:

        这里的二分查找,不同于之前的那个,这里边元素可以重复

第一步:先用二分法找到target;

第二步:从mid分成两部分,分别找第一个元素和最后一个

        第一步,就不用多说,详情可以参考我之前的一篇笔记LeetCode第704题,二分查找,Java实现_代码小船的博客-CSDN博客

        第一步是 step1和step2;然后以mid为分界线,将数组划分为两部分,left-mid 和 mid-right;

         这里只讨论第二步:第二步如果用线性查找的方法,就不满足时间复杂度了,需要继续使用二分查找法,先讨论前半段,也就是找到第一个target,

        这个时候主要目标就是 找到最后一个 <target 的数,最后不满足条件的right1+1记为答案

        同理:后半段,找到第一个 >target 的数,最后的left-1即为答案;

5778810
step1leftmidright
step2leftmidright
step3

left1,

right1,

mid1

left2,

right2

mid1

step4right1legt1right2left2

代码:

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int left = 0;
        int right = nums.length-1;
        int[] result = new int[2];
        while(left <= right){
            int mid = left + (right-left)/2;
            if(nums[mid] > target){
                right = mid-1;
            }else if(nums[mid] == target){
                result[0] = searchFirst(nums, left, mid-1,target);//前半段
                result[1] = searchLast(nums, mid+1, right,target);//后半段
                return result;

            }else if(nums[mid] < target){
                left = mid+1;
            }
        }
        result[0] = -1;
        result[1] = -1;
        return result;
    }

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

    }
    public int searchLast(int nums[], int left, int right,int target ){
        while(left<=right){
            int mid = left + (right-left)/2;
            if(nums[mid] <= target){
                left = mid + 1;
            
            }else{
                right = mid - 1;
            }
        }
        return left-1;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值