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

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

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

看了看难度中等,应该这样写不对吧(但是也过了)。

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        int sum = 0;
        for(int i=0;i<array.length;i++){
            if(k==array[i]){
                sum++;
            }
        }
        return sum;
    }
}

那就考虑数组超级长的情况吧!用二分查找!
如果数组超级长,而所找的数字出现次数,用上面那种方法是不太好的。再加上数组有序,用二分查找再好不过。
我们首先查找k,如果k存在,那会得到一个下标,然后从那个下标向前(注意数组前界),向后计数(注意数组后界)即可。如果没有找到k,后面计数的代码也不会执行。时间复杂度就一次查找加 m(k的个数)次循环。

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        int l = array.length;
        if(l==0){
            return 0;
        }
        int low = 0;
        int high = l-1;
        int mid = (low+high)/2;
        // 如果因为low>high不满足退出的就是没找到k
        while(array[mid]!=k&&low>high){
            if(array[mid]>k){
                high = mid-1;
            }else {
                low = mid+1;
            }
            mid = (low+high)/2;
        }
        // 没找到k,sum一次都不会增加。
        int sum = 0;
        int index = mid;
        while(index<l&&array[index]==k){
            sum++;
            index++;
        }
        index = mid-1;
        while(index>=0&&array[index]==k){
            sum++;
            index--;
        }
        return sum;
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务