统计一个数字在排序数组出现的次数(Java)

统计一个数字在排序数组出现的次数(Java)

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

/**
 * @desc 数字在排序数组中出现的次数
 * @author zhaoliang
 * @date 20200416
 */

public class Main53_1 {
    //  统计一个数字在排序数组中出现的次数。
    public int GetNumberOfK(int [] array , int k) {
        if (array.length == 0){
            return 0;
        }
        int firstPosition = findFirstPosition(array,k);
        int lastPosition = findLastPosition(array,k);
        if (array[firstPosition] != k){
            return 0;
        }
        return lastPosition - firstPosition + 1;
    }

    private int findFirstPosition( int array[],int k)
    {
        int l = 0;
        int r = array.length-1;
        while (l < r){
            int mid = (l + r) >>1;
            if (array[mid] == k){
                if (mid - 1 >= 0 && array[mid - 1] == k){
                    //说明mid当前的位置不是初始位置,k初始位置是在l~mid-1区间
                    r  = mid - 1;
                }else {
                    //就可以说明mid位置的数字就是k的初始位置;
                    return mid;
                }
            }else if (array[mid] > k){
                r = mid - 1;//k属于1-mid
            }else {
                l = mid + 1;//k属于mid+1 - r
            }
        }
        return l;
    }
    private int findLastPosition( int array[],int k)
    {
        int l = 0;
        int r = array.length-1;
        while (l < r){
            int mid = (l + r) >>1;
            if (array[mid] == k){
                if (mid + 1 <array.length && array[mid + 1] == k){
                    //说明mid当前的位置不是终止位置,k初始位置是在mid+1 ~ r区间
                    l  = mid + 1;
                }else {
                    //就可以说明mid位置的数字就是k的终止位置;
                    return mid;
                }
            }else if (array[mid] > k){
                r = mid - 1;//k属于1-mid
            }else {
                l = mid + 1;//k属于mid+1 - r
            }
        }
        return l;
    }
}

发布了71 篇原创文章 · 获赞 0 · 访问量 868

猜你喜欢

转载自blog.csdn.net/sinat_40968110/article/details/105550893