剑指Offer——数字在排序数组中出现的次数

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

public class Solution {
    /*
    思路1:看到排序数组就想到二分法查找,当查找到数字K,再向左右顺序遍历,找到第一个和
          最后一个K,然后计算个数,但是K可能出现O(N)次,所以和从头到尾的遍历是一样的
          时间复杂度;
    思路2:那么我们可以直接用二分查找法直接找到第一个和最后一个K
    
    一下是思路2的实现
    */
    public int GetNumberOfK(int [] array , int k) {
       if(array == null || array.length == 0){
           return 0;
       }
        int first = GetFirstK(array,k,0,array.length-1);
        int last = GetLastK(array,k,0,array.length-1);
        return (last-first+1);
    }
    public int GetFirstK(int [] array , int k, int begin , int end ) {
        if(begin > end){
            return 0;
        }
        int meddle = (begin + end)/2;
        if(array[meddle] > k){
            return GetFirstK(array , k, begin , meddle-1 );
        }
        else if(array[meddle] < k){
            return GetFirstK(array , k, meddle+1 ,end);
        }
        else{
            if((meddle-1)<0 || array[meddle-1] != k){
                return meddle;
            }
            else{
                return GetFirstK(array , k, begin , meddle-1);
            }
        }
    }
    
    public int GetLastK(int [] array , int k, int begin , int end ) {
        if(begin > end){
            return -1;
        }
        int meddle = (begin + end)/2;
        if(array[meddle] > k){
            return GetLastK(array , k, begin , meddle-1 );
        }
        else if(array[meddle] < k){
            return GetLastK(array , k, meddle+1 ,end);
        }
        else{
            if((meddle+1)==array.length || array[meddle+1] != k){
                return meddle;
            }
            else{
                return GetLastK(array , k, meddle+1 ,end);
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值