【小白也能懂】数字在排序数组中出现的次数 做小白也能一秒懂的二分法!

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

http://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2

题目描述
统计一个数字在排序数组中出现的次数

看到这题的第一反应就是暴力求解,当然了,这不失为一种可行的方法,但是大多数情况下,暴力求解会因为速度限制而过不了testcases,所以我们需要进行优化。
而这题里有一个重点,那就是 排序 ,我们就可以立马联想到二分法求解,这样我们的速度就会变成O(nlogn)。
所以这题分三步:

  1. 二分法找出任何一个等于k的数组元素,记录下他的index
  2. 根据这个index向前查找所有等于k的元素数量
  3. 根据这个index向后查找所有等于k的元素数量

具体代码如下:

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        if(array.length == 0 || k < array[0] || k > array[array.length-1]){
            return 0;
        }
        int left = 0;
        int right = array.length -1;
        int count = 0;
        int found = 0;
        int mid = -1;
        while(left < right){
            mid = (left+right)/2;
            if(array[mid] > k){
                right = mid-1;
            }else if(array[mid] < k){
                left = mid+1;
            }else{
                count++;
                found = mid;
                break;
            }
        }

        int prev = mid-1;
        int foll = mid+1;
        while(prev >= left){
            if(array[prev] == k){
                count++;
                prev--;
            }else{
                break;
            }
        }

        while(foll <= right){
            if(array[foll] == k){
                count++;
                foll++;
            }else{
                break;
            }
        }
        return count;
    }
}
全部评论
时间效率O(n)
2 回复 分享
发布于 2020-02-15 21:07
好像题目并没有说明是递增还是递减吧
点赞 回复 分享
发布于 2020-03-28 00:40
上面的二分查找的时间复杂度是O(logn)吧
点赞 回复 分享
发布于 2020-04-16 16:37
你这效率跟直接遍历一个样...
点赞 回复 分享
发布于 2020-07-22 23:15
while(left < right)这里应该是<=吧,否则数组只有一个元素且正好为k的时候输出是0
点赞 回复 分享
发布于 2021-04-29 20:22

相关推荐

评论
13
2
分享
牛客网
牛客企业服务