/** * 题目: * 统计一个数字在排序数组中出现的次数。 * 解题思路: * 利用二分查找分别找出第一次出现k和最后一次出现k的位置,即可求得k在数组中出现的次数。 */ public class P263_GetNumberOfK { public int GetNumberOfK(int[] array, int k) { //判断数组是否为空 if (array == null || array.length == 0) { return 0; } int result = 0; //第一次出现k的位置 int firstK = GetFirstK(array, k,0,array.length-1); //最后一次出现k的位置 int lastK = GetLastK(array, k,0,array.length-1); if (firstK > -1 && lastK > -1) { result = lastK - firstK + 1; } return result; } public int GetFirstK(int[] array, int k, int start, int end) { if (start > end) { return -1; } int mid = (start + end) / 2; if (k == array[mid]) { if (mid > 0 && array[mid - 1] != k || mid == 0) { return mid; } else{ end = mid - 1; } } else if (array[mid] > k) { end = mid - 1; } else if (array[mid] < k) { start = mid + 1; } return GetFirstK(array, k, start, end); } public int GetLastK(int[] array, int k, int start, int end) { if (start > end) { return -1; } int mid = (start + end) / 2; if (array[mid] == k) { if ( mid == end||mid > 0 && array[mid + 1] != k ) { return mid; } else { start = mid + 1; } } else if (array[mid] > k) { end = mid - 1; } else if (array[mid] < k) { start = mid + 1; } return GetLastK(array, k, start, end); } public static void main(String[] args) { int[] array = {1, 3, 3, 3, 3,4,5}; int k = 2; P263_GetNumberOfK test = new P263_GetNumberOfK(); int result = test.GetNumberOfK(array, k); System.out.println(result); } }
剑指offer:数字在排序数组中出现的次数(java)
猜你喜欢
转载自blog.csdn.net/Sunshine_liang1/article/details/82864729
今日推荐
周排行