java中对数组中文件名排序_数字在排序数组中出现的次数

0bfc2afc09dae6702f76bec84cbd2723.gif

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

/** * 暴力解法,不管有序还是无序直接全部遍历 * 时间复杂度:O(N) * 空间复杂度:O(1) * @param array * @param k * @return */public int getNumberOfK1(int[] array, int k) {    int count = 0;    for (int i = 0; i < array.length; i++) {        if (array[i] == k) {            count++;        }    }    return count;}

虽然说使用暴力解法很爽,但是我们不能忽略到题目所给的提示,它是一个有序的数组,这样的话,其实我们可以使用二分查找,找到其值的上界和下界。然后用上界减去下界就可以了。因为这个是用到了二分法,担心有一些小伙伴不是很熟悉二分法,因此在下一篇文章中着重讲解了下二分法。

   public static void main(String[] args) {        int[] array = {1, 2, 2, 2, 4};        int result = getNumberOfK2(array,2);        System.out.println("result = [" + result + "]");    } public static int getNumberOfK3(int[] array, int k) {        int left = left_bound(array,k);        int right = right_bound(array,k);        return right-left;    }    //左边界    public static int left_bound(int[] array, int target) {        int left = 0;        int right = array.length;  //注意        while (left < right) {  //注意            int mid = (left + right) / 2;            if (array[mid] < target) {                left = mid + 1;            } else if (array[mid] > target) {                right = mid;   //注意            } else {                right = mid;            }        }        return left;    }    //右边界    public static int right_bound(int[] array, int target) {        int left = 0;        int right = array.length;   //注意        while (left < right) {      //注意            int mid = (left + right) / 2;            if (array[mid] < target) {                left = mid + 1;            } else if (array[mid] > target) {                right = mid;//注意            } else {                left = mid + 1;            }        }        return right;    }

结果:

7738589f558953f31454fe417a321d7d.png

ps: 想要查看之前的文章都已经保存

d4ba7f1ece9992f3f8503ce4f43a1326.png

- THE END -

作者简介

bf4559e584e410892a5bf287ad6d4eed.png

Mr.W

白天搬砖,晚上砌梦想。

相信每个人有故事,程序员更是有许多事故,书写最接地气的程序员故事,为大家找出更好的资料。

c13fee9b1147380b1db405028449e435.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值