剑指offer——37.数字在排序数组中出现的次数
题目描述
统计一个数字在排序数组中出现的次数。
思路:
二分查找第一次出现的位置和最后一次出现的位置,相减即可。
代码:
public class Solution { public int GetNumberOfK(int [] array , int k) { if(array == null || array.length == 0) return 0; int first = getFirstK(array,k,0,array.length - 1); int last = getLastK(array,k,0,array.length - 1); if(first == -1 || last == -1) return 0; else return last - first + 1; } private int getFirstK(int [] array, int k, int low, int high){ int mid = 0; while(low <= high){ mid = low + (high -low) / 2; if(array[mid] == k){ if(mid > 0 && array[mid - 1] != k || mid == 0) return mid; else high = mid - 1; } else if(array[mid] > k) high = mid - 1; else low = mid + 1; } return -1; } private int getLastK(int [] array, int k, int low, int high){ int mid = 0; while(low <= high){ mid = low + (high -low) / 2; if(array[mid] == k){ if(mid < array.length - 1 && array[mid + 1] != k || mid == array.length - 1) return mid; else low = mid + 1; } else if(array[mid] > k) high = mid - 1; else low = mid + 1; } return -1; } }