题目描述
统计一个数字在排序数组中出现的次数。
解题思路
二分法递归查找,一看到已排序就要想到二分
代码
/** * */ package 数组; /** * <p> * Title:GetNumberOfK * </p> * <p> * Description: * </p> * * @author 田茂林 * @data 2017年8月8日 上午11:14:03 */ public class GetNumberOfK { /** * @param args */ public int IntGetNumberOfK(int[] array, int k) { int count = 0; for (int i = 0; i < array.length; i++) { if (k == array[i]) { count++; } } return count; } /** * 二分法定位第一次出现的位置和最后一次出现的位置 * * @param args */ public int IntFindGetNumberOfK(int[] array, int k) { int length = array.length; if (length == 0) { return 0; } int firstK = getFirstK(array, k, 0, length - 1); int lastK = getLastK(array, k, 0, length - 1); if (firstK != -1 && lastK != -1) { return lastK - firstK + 1; } return 0; } // 递归写法 private int getFirstK(int[] array, int k, int start, int end) { if (start > end) { return -1; } int mid = (start + end) >> 1; if (array[mid] > k) { return getFirstK(array, k, start, mid - 1); } else if (array[mid] < k) { return getFirstK(array, k, mid + 1, end); } else if (mid - 1 >= 0 && array[mid - 1] == k) { return getFirstK(array, k, start, mid - 1); } else { return mid; } } // 循环写法 private int getLastK(int[] array, int k, int start, int end) { int length = array.length; int mid = (start + end) >> 1; while (start <= end) { if (array[mid] > k) { end = mid - 1; } else if (array[mid] < k) { start = mid + 1; } else if (mid + 1 < length && array[mid + 1] == k) { start = mid + 1; } else { return mid; } mid = (start + end) >> 1; } return -1; } public static void main(String[] args) { GetNumberOfK g = new GetNumberOfK(); int[] a = { 1, 2, 2, 2, 2, 2, 4, 5 }; // System.out.println(g.IntGetNumberOfK(a, 2)); System.out.println(g.IntFindGetNumberOfK(a, 2)); } }