统计一个数字在排序数组中出现的次数。
package com.google.android;
public class CountK {
public static void main(String[] args) {
int[] data = { 1, 2, 3, 3, 3, 3, 4, 5 };
int count = getCountK(data, 3);
System.out.println(count);
}
private static int getCountK(int[] data, int k) {
if (data == null || data.length == 0) {
return 0;
}
int firstK = getFirstK(data, 0, data.length - 1, k);
int lastK = getLastK(data, 0, data.length - 1, k);
int count = 0;
if (firstK > -1 && lastK > -1) {
count = lastK - firstK+1;
}
return count;
}
private static int getLastK(int[] data, int start, int end, int k) {
if (start > end) {
return -1;
}
int middleIndex = (start + end) / 2;
int middleData = data[middleIndex];
if (middleData == k) {
// 后边界
if ((middleIndex < data.length - 1 && data[middleIndex + 1] != k)
|| middleIndex == data.length - 1) {
return middleIndex;
} else {
start = middleIndex + 1;
}
} else if (middleData > k) {
start = middleIndex + 1;
} else {
end = middleIndex - 1;
}
return getLastK(data, start, end, k);
}
private static int getFirstK(int[] data, int start, int end, int k) {
if (start > end) {
return -1;
}
int middleIndex = (start + end) / 2;
int middleData = data[middleIndex];
if (middleData == k) {
if (middleIndex > 0 && data[middleIndex - 1] != k) {
return middleIndex;
} else {
end = middleIndex - 1;
}
} else if (middleData > k) {
end = middleIndex - 1;
} else {
start = middleIndex + 1;
}
return getFirstK(data, start, end, k);
}
}