牛客剑指Offer-数字在升序数组中出现的次数

题目

统计一个数字在升序数组中出现的次数。
示例1

输入
[1,2,3,3,3,3,4,5],3
返回值
4

题解

第一种最简单的方法是O(n)复杂度。遍历数组统计结果。

 public int GetNumberOfK(int [] array , int k) {
       if(array==null||array.length==0){
           return 0;
       }
        int len = array.length;
        int count = 0;
        for(int i=0;i<len;i++){
            if(k==array[i]){
                count++;
            }
        }
        return count;
    }

但是这种方法没用上有序数组的这个特点,说道有序数组
,首先想起来的是二分查找,因此可以利用二分查找找出第一个出现k的位置后最后出现k的位置,两者相减就是结果。

  public int GetNumberOfK(int [] array , int k) {
       if(array==null||array.length==0){
           return 0;
       }
        return biSearch(array,k+0.5)-biSearch(array,k-0.5);
    }
    public int biSearch(int[] data, double num){
        int s = 0, e = data.length-1;     
        while(s <= e){
            int mid = (e - s)/2 + s;
            if(data[mid] < num)
                s = mid + 1;
            else if(data[mid] > num)
                e = mid - 1;
        }
        return s;
    }
posted @ 2020-12-07 17:57  起个名字都这么男  阅读(101)  评论(0编辑  收藏  举报