美文网首页
剑指Offer35 数组数数(二分查找变形)

剑指Offer35 数组数数(二分查找变形)

作者: 北国雪WRG | 来源:发表于2019-01-13 12:34 被阅读0次

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

题目很简单,可以直接遍历一遍完成。但是这样有序的条件运用的就不是很好。有序数组 数字出现的次数 = 最后一个数字下标 - 开始数字的下标。意味着,我们只需要找到开始下标和结束下标就行了。
有序数组寻找一个数最好的方法就是二分查找。那么问题就简单了,使用两次有序查找搞定。

    public int GetNumberOfK(int[] array, int k) {
        // 这里的 +- 0.5 是精华所在
        return indexOf(array, k + 0.5) - indexOf(array, k - 0.5);
    }

    public int indexOf(int[] array, double k) {
        int begin = 0;
        int end = array.length - 1;
        int mid = (begin + end) / 2; //

        while (begin <= end) { 
            // 这里不要使用 < ,当begin = end 的时候,
            //begin不一定是需要的。{1,1,1,1,2} 统计1的数量,会漏掉一个1
            if (array[mid] > k) {
                end = mid - 1;
            } else {
                begin = mid + 1;
            }
            mid = (begin + end) / 2;
        }
        return begin;
    }

最后,你也可以向下面这哥们放荡不羁


image.png

相关文章

  • 剑指Offer35 数组数数(二分查找变形)

    统计一个数字在排序数组中出现的次数。 题目很简单,可以直接遍历一遍完成。但是这样有序的条件运用的就不是很好。有序数...

  • 剑指offer——JAVA版

    Array 数组题目汇总[18题] [剑指offer] 二维数组中的查找 [剑指offer] 旋转数组的最小数字 ...

  • 二分查找 (lintcode:first-position-of

    二分查找 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第...

  • 二分查找

    二分查找 描述 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到targ...

  • 数据结构与算法笔记day13:二分查找(下)

    上一节我们讲了二分查找的最基本的写法,就是在一个没有重复元素的数组中查找,今天来看四个常见的二分查找变形问...

  • 算法-查找-二分查找变形

    经典的二分查找很好理解,也很好实现,那一起来看下二分查找的变形问题。常见的二分查找变形问题有: 查找第一个等于待查...

  • 二分查找在数据库实现(转)

    思考一道二分查找(Binary Search)的题目给定一个升序排列的自然数数组,数组中包含重复数字,例如:[1,...

  • 14.二分查找

    14. 二分查找 描述 笔记 数据 评测 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(lo...

  • 二分法查找

    二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法查找的前提是数组必须排序!!!二分法...

  • 查找

    顺序查找 二分查找 插值查找 查找子数组最大和

网友评论

      本文标题:剑指Offer35 数组数数(二分查找变形)

      本文链接:https://www.haomeiwen.com/subject/tgbkdqtx.html