/**
* 数字在升序数组中出现的次数
*
* 统计一个数字在升序数组中出现的次数。
*/
public class JZ037GetNumberOfK {
public int GetNumberOfK(int [] array , int k) {
if (array == null || array.length <= 0) {
return 0;
}
if (k < array[0] || k > array[array.length - 1]) {
return 0;
}
int count = 0;
for (int a : array) {
if (a != k) {
count++;
}
}
if (count == array.length) {
return 0;
}
int start = 0;
int end = array.length - 1;
int startIndex = getStartIndex(array, start, end, k);
int endIndex = getEndIndex(array, start, end, k);
return (endIndex - startIndex + 1);
}
private int getStartIndex(int[] array, int start, int end, int k) {
if (start > end) {
return -1;
}
int mid = (start + end) >> 1;
if (array[mid] == k) {
if ((mid > start && array[mid - 1] != k) || (mid == start)) {
return mid;
} else {
end = mid - 1;
}
}
if (array[mid] < k) {
start = mid + 1;
}
if (array[mid] > k) {
end = mid - 1;
}
return getStartIndex(array, start, end, k);
}
private int getEndIndex(int[] array, int start, int end, int k) {
if (start > end) {
return 0;
}
int mid = (start + end) >> 1;
if (array[mid] == k) {
if ((mid < end && array[mid + 1] != k) || (mid == end)) {
return mid;
} else {
start = mid + 1;
}
}
if (array[mid] < k) {
start = mid + 1;
}
if (array[mid] > k) {
end = mid - 1;
}
return getEndIndex(array, start, end, k);
}
/*
数字在升序数组中出现的次数
总结:
二分法的使用
*/
}