剑指offer-第六章面试中的各项能力(数字在排序数组中出现的次数)

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

思路:采用二分查找,找到该数字在数组中第一次出现的位置,然后再找到组后一个出现的位置。两者做减法运算再加1.时间复杂度为O(logn)

Java代码:

//数字K在排序数组中出现的次数
//思路:用二分查找,找到第一个k和最后一个K
public class NumberCount {
    public int numberCount(int[] a,int k){
        if(a==null)
            return 0;
        int start=0;
        int end=a.length-1;
        int first=firstK(a,k,start,end);
        int last=endK(a,k,start,end);
        return last-first+1;
    }
    //通过二分查找,找到最后一个K
    private int endK(int[] a, int k, int start, int end) {
        if(a==null)
            return 0;
        int middle=(start+end)/2;
        if(a[middle]==k){
            if(a[middle]==k&&a[middle+1]!=k||middle==a.length-1)
                return middle;
            else
                 start=middle+1;
        }
        else if(a[middle]<k)
            start=middle+1;
        else
            end=middle-1;
        return endK(a,k,start,end);
    }
    //通过二分查找找到第一个K
    public int firstK(int[] a, int k, int start, int end) {
        if(a==null)
            return 0;
        int middle=(start+end)/2;
        if(a[middle]==k){
            if(middle==0||a[middle-1]!=k&&a[middle]==k)
                return middle;
            else
                end=middle-1;
        }
        else if(a[middle]<k)
            start=middle+1;
        else
            end=middle-1;
        return firstK(a,k,start,end);
    }
    public static void main(String[] args) {
        int[] a={1,3,3,3,7,4,5};
        NumberCount numberCount=new NumberCount();
        int number=numberCount.numberCount(a, 3);
        System.out.println(number);
        
    }
}

 

posted @ 2015-08-29 10:52  lisahappy  阅读(229)  评论(0编辑  收藏  举报