剑指offer — 数字在排序数组中出现的次数
解题思路:使用两个二分法,进行处理,时间复杂度O(logn)
java
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if (array == null || array.length == 0) {
return 0;
}
if (array[0] > k || array[array.length - 1] < k) {
return 0;
}
return getLast(array, k) - getFirst(array, k) + 1;
}
private int getFirst(int[] array, int k) {
int start = 0;
int end = array.length - 1;
while (start + 1 < end) {
int mid = (end - start) / 2 + start;
if (array[mid] < k) {
start = mid;
} else {
end = mid;
}
}
return array[start] == k ? start : end;
}
private int getLast(int[] array, int k) {
int start = 0;
int end = array.length - 1;
while (start + 1 < end) {
int mid = (end - start) / 2 + start;
if (array[mid] <= k) {
start = mid;
} else {
end = mid;
}
}
return array[end] == k ? end : start;
}
}