算法刷题(11)--统计一个数字在排序数组中出现的次数。
方法一:(暴力破解)
package p2; /** * 题目描述: * 统计一个数字在排序数组中出现的次数。 * @author Guozhu Zhu * @date 2018/4/25 * @version 1.0 * */ public class Test01 { public static void main(String[] args) { int[] array = {1, 2, 3, 3, 3, 4, 5}; System.out.println(getNumberOfK(array, 3)); } public static int getNumberOfK(int[] arr, int k) { int count = 0; for (int i = 0; i < arr.length; i++) { if (arr[i] == k) { count++; } } return count; } }
方法二(二分查找算法):
package p2; /** * 二分查找算法 * @author Guozhu Zhu * @date 2018/4/25 * @version 1.0 * */ public class Test02 { public static void main(String[] args) { int[] array = {1, 2, 3, 3, 3, 4, 5}; System.out.println(GetNumberOfK(array, 3)); } public static int GetNumberOfK(int[] array , int k) { int i = getFirstK(array, k, 0, array.length-1); int j = getLastK(array, k, 0, array.length-1); if (i != -1 && j != -1) return j-i+1; return 0; } public static int getFirstK(int[] array , int k, int low, int high) { while (low <= high) { int mid = (low+high)/2; if (k > array[mid]) { low = mid + 1; } else if (k < array[mid]) { high = mid - 1; } else if (mid-1 >= 0 && array[mid-1] == k) {// 找“头” high = mid - 1; } else { return mid; } } return -1; } public static int getLastK(int[] array , int k, int low, int high) { while (low <= high) { int mid = (low + high)/2; if (k > array[mid]) { low = mid + 1; } else if (k < array[mid]) { high = mid - 1; } else if (mid+1 < array.length && array[mid+1] == k) {// 找“尾” low = mid + 1; } else { return mid; } } return -1; } }