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

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

一、题目详情

原题链接:剑指 Offer 53 - I. 在排序数组中查找数字 I

统计一个数字在排序数组中出现的次数。

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: 2

示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: 0

提示:

  • 0 <= nums.length <= 105
  • -109 <= nums[i] <= 109
  • nums 是一个非递减数组
  • -109 <= target <= 109

二、暴力法

class Solution {
    public int search(int[] nums, int target) {
        int times = 0;

        for(int i = 0;i < nums.length;i++){
            if(nums[i] == target){
                times++;
            }
        }

        return times;
    }
}

在这里插入图片描述

三、二分查找法

class Solution {
    private int times = 0;

    public int search(int[] nums, int target) {
        if(nums == null || nums.length == 0){
            return 0;
        }
    
        return binarySearch(nums,target,0,nums.length - 1);
    }

    public int binarySearch(int[] nums, int target,int l,int r){
        if(l > r){
            return 0;
        }

        int mid = (l + r) / 2;
        int midVal = nums[mid];
        
        if(target > midVal){
            return binarySearch(nums,target,mid + 1,r);
        }else if(target < midVal){
            return binarySearch(nums,target,l,mid - 1);
        }else{
            //此时定位到target值出现的位置
            l = mid;
            r = mid;
            times++;
            
            //向mid的左边扫描,将满足寻找元素的最左下标加入到result[0](不能超过被查询数组的左边界)
            while(l - 1 >= 0 && nums[l] == nums[l - 1]){
                times++;
                mid--;
                l--;
            }
            
            //向mid的右边扫描,将满足寻找元素的最右下标加入到result[1](不能超过被查询数组的右边界)
            while(r + 1 < nums.length && nums[r] == nums[r + 1]){
                times++;
                mid++;
                r++;
            }
            return times;
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值