题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。

       如果遍历数组或二分查找的方法来统计,则不是最简单的方法。可以利用二分查找方法找出K第一次和最后一次出现的index,这样就可以计算出次数了。

代码实现:

public class Solution{
    public static int getNumberOfK(int[] arr,int k){
          int number=0;
          if(arr!=null&&arr.length!=0){
                int first=getFirstK(arr,k,0,arr.length-1);
                int last=getLastK(arr,k,0,arr.length-1); 
                if(first>-1&&last>-1){
                     number=last-first+1;
                }
          }
          return number;
    }

    public static int getFirstK(int[] arr,int k,int start,int end){
          if(start>end){
                return -1;
          }
          int middle=(start+end)/2;
          if(arr[middle]==k){
                if((middle>0&&arr[middle-1]!=k)||middle==0){
                      return middle;
                }else{
                      end=middle-1;
                }
          }else if(arr[middle]>k){
                end=middle-1;
          }else{
                start=middle+1;
          }
          return getFirstK(arr,k,start,end);
    }

    public static int getLastK(int[] arr,int k,int start,int end){
          if(start>end){
               return -1;
          }
          int middle=(start+end)/2;
          if(arr[middle]==k){
               if((middle<arr.length-1&&arr[middle+1]!=k)||middle==arr.length-1){
                    return middle;
               }else{
                    start=middle+1;
               }
          }else if(arr[middle]>k){
              end=middle-1;
          }else{
              start=middle+1;
          }
          return getLastK(arr,k,start,end);
    }

    public static void main(String[] args){
          int[] arr={1,2,3,3,3,3,4,5};
          int times=getNumberOfK(arr,3);
          System.out.println(times);
    }
}

 

 posted on 2018-11-22 23:00  会飞的金鱼  阅读(86)  评论(0)    收藏  举报