剑指 Offer 53 - I. 在排序数组中查找数字java题解

啥也写不对真烦******************

思路

因为是有序数组,所以这个数字的出现是连续的。找到左右边界left和right,出现次数就是right-left-1
在这里插入图片描述
使用二分查找,
nums[mid]>target时,right–;nums[mid]<target时,left++;
nums[mid]==target时,找右边界left++;找左边界right–;
在这里插入图片描述

优化:
查找完右边界后,可用 nums[right] ==right 判断数组中是否包含target ,若不包含则直接提前返回0 ,无需后续查找左边界。

代码

class Solution {
    public int search(int[] nums, int target) {
        int len=nums.length;
        if(len==0){
            return 0;
        }
        //初始化
        int left=0;
        int right=len-1;
        int mid;
        //找右边界
        //right<left时退出
        while(left<=right){
            mid=left+(right-left)/2;
            if(nums[mid]==target){
                left=mid+1;//右边界
            }
            else if(nums[mid]>target){
                right=mid-1;
            }
            else{
                left=mid+1;
            }
        }
        //跳出时left指向右边界
        //右边界b
        int b=left;

        //数组中无target 提前返回
        if(right >= 0 && nums[right] != target) return 0;

        //重新初始化
        left=0;
        //right=len-1;优化时删掉这句
		//查找完右边界后,左边界一定在闭区间[0,right] 中,因此直接从此区间开始二分查找即可。
		
        //找左边界
        while(left<=right){
            mid=left+(right-left)/2;
            if(nums[mid]==target){
                right=mid-1;//左边界
            }
            else if(nums[mid]>target){
                right=mid-1;
            }
            else{
                left=mid+1;
            }
        }
        //跳出时right指向左边界
        //左边界a
        int a=right;

        return b-a-1;
    }
}

复杂度

时间复杂度O(logn) :二分法为对数级别复杂度
空间复杂度O(1)

结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值