问题如下:
统计一个数字:在排序数组中出现的次数。
示例 :
例如输入排序数组{ 1, 2, 3, 3, 3, 3, 4, 5}和数字3 ,由于3 在这个数组中出现了4 次,因此输出4 。
代码
public static int getCountInSortedArray(int[] arr, int k) {
int count = 0;
if (arr == null || arr.length == 0) return 0;
int firstIndex = findFirstIndex(arr, k, 0, arr.length - 1);
int lastIndex = findLastIndex(arr, k, 0, arr.length - 1);
System.out.println("firstIndex=== " + firstIndex + " lastIndex=== " + lastIndex);
if (firstIndex > -1 && lastIndex > -1) {
count = lastIndex - firstIndex + 1;
}
return count;
}
/**
* 采用二分查找查询index
*
* @param arr
* @param k
* @param start
* @param end
* @return
*/
private static int findFirstIndex(int[] arr, int k, int start, int end) {
if (start > end) return -1;
int midIndex = start + (end - start) / 2;
int midValue = arr[midIndex];
if (midValue == k) {
if (midIndex > 0 && arr[midIndex - 1] != k || midIndex == 0) {
return midIndex;
} else {
// 从中间向前查找
end = midIndex - 1;
}
} else if (midValue > k) {
end = midIndex - 1;
} else {
start = midIndex + 1;
}
return findFirstIndex(arr, k, start, end);
}
/**
* 查找最后一个index
*
* @param arr
* @param k
* @param start
* @param end
* @return
*/
private static int findLastIndex(int[] arr, int k, int start, int end) {
if (start > end) return -1;
int midIndex = start + (end - start) / 2;
int midValue = arr[midIndex];
if (midValue == k) {
if (midIndex + 1 < arr.length && arr[midIndex + 1] != k || midIndex == arr.length - 1) {
return midIndex;
} else {
// 从中间向后查询
start = midIndex + 1;
}
} else if (midValue > k) {
end = midIndex - 1;
} else {
start = midIndex + 1;
}
return findLastIndex(arr, k, start, end);
}