第一次出现的特征与最后一次出现的特征

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

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

排序数组中,当相等时,需要区分第一次还是最后一次出现。

1.第一次:mid==0或者nums[mid-1]<nums[mid]

2. 最后一次出现: mid==nums.length-1或者nums[mid]<nums[mid+1]

需要分两次,不能同时找出第一次和最后一次。因为那时当相等时,就不知道如何移动了!!

首先要存在,然后再谈第一次和最后一次。

    /**
     * 统计一个数字在升序数组中出现的次数。
     * @param array 升序数组
     * @param k 数字
     * @return 出现的次数
     */
    public int GetNumberOfK(int [] array , int k) {
        int res=0;
        if(array==null||array.length==0){
            return 0;
        }
        int first=getFirstK(array,k);
        int last=getLastK(array,k);
        if(first>-1&&last>-1){
            res=last-first+1;
        }
        return res;

    }
    public int getFirstK(int[] array,int k){
        int start=0,end=array.length-1;
        while (start<=end){
            int mid=start+(end-start)/2;
            if(array[mid]<k){
                start=mid+1;
            }else if(array[mid]>k){
                end=mid-1;
            }else {
                //相等
                if(mid==0||array[mid-1]<array[mid]){
                    return mid;
                }else {
                    end=mid-1;
                }
            }
        }
        return -1;
    }

    public int getLastK(int[] array,int k){
        int start=0,end=array.length-1;
        while (start<=end){
            int mid=start+(end-start)/2;
            if(array[mid]<k){
                start=mid+1;
            }else if(array[mid]>k){
                end=mid-1;
            }else {
                //相等
                if(mid==array.length-1||array[mid]<array[mid+1]){
                    return mid;
                }else {
                    start=mid+1;
                }
            }
        }
        return -1;
    }
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务