面试题题53-题目一:数字在排序数组出现的次数

/*

 * 面试题题53-题目一:数字在排序数组出现的次数

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

 * 思路:利用二分查找+递归思想,进行寻找。当目标值与中间值相等时进行判断

 */

 

 

public class No53GetNumberOfK {

 

    public static void main(String[] args) {

       No53GetNumberOfK n = new No53GetNumberOfK();

       int[] arr = {1,1,2,3,3,3,3,3,4,5,6,7};

       System.out.println(n.GetNumberOfK(arr, 3));

 

    }

 

    public int GetNumberOfK(int[] array, int k) {

       int number = 0;

      

       if (array != null && array.length != 0) {

           int first = getFirstK(array, k, 0, array.length - 1);

           int last = getLastK(array, k, 0, array.length - 1);

          

           if (first > -1 && last > -1) {

              number = last - first + 1;

           }

       }

       return number;

    }

    //找到排序数组中的最后一个K

    private int getLastK(int[] array, int k, int start, int end) {

       if (start > end) {

           return -1;

       }

      

       int midIndex = (start + end) / 2;

       int midData = array[midIndex];

      

       if (midData == k) {

           if((midIndex < array.length - 1 && array[midIndex + 1] != k) || midIndex == array.length -1 ) {

              return midIndex;

           } else {

              start = midIndex + 1;

           }

       } else if (midData < k) {

           start = midIndex + 1;

       } else {

           end = midIndex - 1;

       }

      

       return getLastK(array,k,start,end);

    }

    //找到排序数组中的第一个K

    private int getFirstK(int[] array, int k, int start, int end) {

       if (start > end) {

           return -1;

       }

      

       int midIndex = (start + end) / 2;

       int midData = array[midIndex];

      

       if (midData == k) {

           if((midIndex > 0 && array[midIndex - 1] != k) || midIndex == 0 ) {

              return midIndex;

           } else {

              end = midIndex - 1;

           }

       } else if (midData < k) {

           start = midIndex + 1;

       } else {

           end = midIndex - 1;

       }

      

       return getFirstK(array,k,start,end);

    }

 

}

猜你喜欢

转载自blog.csdn.net/juaner1993/article/details/82760560