题解 | #数字在升序数组中出现的次数#

数字在升序数组中出现的次数

https://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2

public class Solution {
    public int GetNumberOfK(int [] array, int k) {
        // 数组为空或者数组元素个数为0,直接返回
        if (array == null || array.length == 0) {
            return 0;
        }
        // 使⽤⼆分法,找出等于k的数的索引
        int index = findIndex(array, k, 0, array.length - 1);
        // 索引为-1,则说明该数不存在
        if (index == -1) {
            return 0;
        }
        // 存在则index处存在⼀个
        int count = 1;
        // 向左边拓展,计算相等的个数
        for (int left = index - 1; left >= 0; left--) {
            if (array[left] == k) {
                count++;
            }
        }
        // 向右边拓展,计算相等的个数
        for (int right = index + 1; right < array.length; right++) {
            if (array[right] == k) {
                count++;
            }
        }
        return count;
    }

    /**
     * 二分查找出k值的索引
     * */
    public int findIndex(int[] array, int k, int left, int right) {
        // 只剩下⼀个数,直接和k⽐较
        if (left == right) {
            return array[left] == k ? left : -1;
        } else {
            // 中间的数索引为mid。将数组分为两半
            int mid = left + (right - left) / 2;
            // 等于k直接返回当前索引
            if (array[mid] == k) {
                return mid;
            } else if (array[mid] < k) {
                // mid索引的数⼩于k,则k只可能在右边⼀半
                return findIndex(array, k, mid + 1, right);
            } else {
                // 否则在左边⼀半
                return findIndex(array, k, left, mid - 1);
            }
        }
    }
}

解题思想:二分查找k值索引,左右移动统计次数。

#算法##算法笔记#
全部评论

相关推荐

牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务