剑指Offer 数字在排序数组中出现的次数

题目:统计一个指定的数在已排序数组中出现的个数

一个非常容易想到的办法就是当发现目标数字时开始计数,开始计数后遇到与目标数字不相等的数字时则停止计数并返回。当然此题的核心在于寻找目标数字的起始和终止点即可,因此完全可以想到使用二分查找的方法,代码如下

public class Solution {
    private static int GetStartIndex(int[] array, int start, int end, int k){
        if (start > end){
            return -1;
        }
        int middle = (start + end)/2;
        if (array[middle] == k){
            // 当middle 与k相等时,我们需要判断它是不是k的起始点
            // 如果是起点那么它的左边必然不等于k,或者middle本身就是0
            if ((middle > 0 && array[middle-1] != k) || middle == 0){
                return middle;
            }
            else{
                // 否则说明k的起点在middle的左侧
                end = middle - 1;
            }
        }
        else if (array[middle] > k){
            // 当k小于middle时,说明要在左边寻找
            end = middle -1;
        }
        else{
            start = middle + 1;
        }
        return GetStartIndex(array, start, end, k);
    }
       private static int GetEndIndex(int[] array, int start, int end, int k){
        if (start > end){
            return -1;
        }
        int middle = (start + end)/2;
        if (array[middle] == k){
            // 当middle 与k相等时,我们需要判断它是不是k的结束点
            // 如果是终点那么它的右边必然不等于k,或者middle本身就是终点
            if ((middle < array.length - 1 && array[middle+1] != k) || middle == array.length-1){
                return middle;
            }
            else{
                // 否则说明k的起点在middle的右侧
                start = middle + 1;
            }
        }
        else if (array[middle] > k){
            // 当k小于middle时,说明要在左边寻找
            end = middle -1;
        }
        else{
            start = middle + 1;
        }
        return GetEndIndex(array, start, end, k);
    }
    public static int GetNumberOfK(int [] array , int k) {
        // 使用二分查找的方法来解决
        int res = 0;
        if (array != null && array.length > 0){
            int start = GetStartIndex(array, 0, array.length-1, k);
            int end = GetEndIndex(array, 0, array.length-1, k);
            if (start > -1 && end > -1){
            res =  end - start + 1;
            }
        }

       return res;
    }
}

本题是蛮简单的,这是我在租的小屋中写下的第一道题,主要是纪念一下哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值