题目描述
统计一个数字在排序数组中出现的次数。
解答:有序数组用二分法分别求起始和结束节点(看到有一种解法:就是分别找k+0.5和k-0.5这样过程好像简单一点点)
public class Q_37 {
public int GetNumberOfK(int[] array, int k) {
if(array.length==0){
return 0;
}
int first = getFirst(array, k);
int last = getLast(array, k);
if (first != -1 && last != -1) {
return last - first + 1;
}
return 0;
}
private int getFirst(int[] array, int k) {
int start = 0;
int end = array.length - 1;
int mid = (start + end) >> 1;
while (start <= end) {
if (array[mid] < k) {
start = mid + 1;
} else if (array[mid] > k) {
end = mid - 1;
} else if (mid > 0 && array[mid - 1] == k) {
end = mid - 1;
} else {
return mid;
}
mid = (start + end) >> 1;
}
return -1;
}
private int getLast(int[] array, int k) {
int start = 0;
int end = array.length - 1;
int mid = (start + end) >> 1;
while (start <= end) {
if (array[mid] < k) {
start = mid + 1;
} else if (array[mid] > k) {
end = mid - 1;
} else if (mid < array.length - 1 && array[mid + 1] == k) {
start = mid + 1;
} else {
return mid;
}
mid = (start + end) >> 1;
}
return -1;
}
public static void main(String[] args) {
int[] s = {1, 2, 2, 3, 3, 3, 3, 5, 6};
System.out.println(new Q_37().GetNumberOfK(s, 3));
}}

京公网安备 11010502036488号