剑指offer算法题:数字在排序数组中出现的次数GetNumberOfK

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

二分查找去查第一个、最后一个k。

public class Solution {
    public static int GetNumberOfK(int [] array , int k) {
        int len;
        if(array == null || (len = array.length) == 0)
            return 0;
        int firstK = getFirstK(array,k,0,len-1);
        int lastK = getLastK(array,k,0,len-1);
        return firstK == -1 ? 0 : lastK - firstK + 1;
    }
    private static int getFirstK(int[] array,int k,int l,int h) {
        if(l > h)// !
            return -1;
        int m = l + (h - l >> 1);//位运算符优先级比加减低
        if(array[m] == k) {
            if((m > 0 && array[m-1] != k) || m == 0)
                return m;
            else
                return getFirstK(array,k,l,m-1);
        }else if(array[m] > k)
            return getFirstK(array,k,l,m-1);
        else
            return getFirstK(array,k,m+1,h);
    }
    private static int getLastK(int[] array,int k,int l,int h) {
        if(l > h)
            return -1;
        int m = l + (h - l >> 1);
        if(array[m] == k) {
            if((m < array.length - 1 && array[m+1] != k) || m == array.length - 1)
                return m;
            else
                return getLastK(array,k,m+1,h);
        }else if(array[m] > k)
            return getLastK(array,k,l,m-1);
        else
            return getLastK(array,k,m+1,h);
    }
}

你可能感兴趣的:(剑指offer)