1.题目
2.思路和解法(二分法)
看到排好序的数组,立马想到二分法,但若是按照找到一个k后,向左、向右遍历找的话,时间复杂度为O(n),所以我们不这样做,我们利用二分法缩小范围,找到第一个出现k的位置和最后一个出现k个位置,就可以计算k出现的情况。
注意:
1.特殊情况,第一,数组中无此数,第二,数组为空或者长度为0
2.end、start的范围写错
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array == null || array.length == 0){
return 0;
}
int number = 0;
int first = firstIndex(array, k);
int last = lastIndex(array, k);
if(first > -1 && last > -1){
number = last - first + 1;
}
return number;
}
public int firstIndex(int[] array, int k){
int start = 0, end = array.length-1;
while(start <= end){
int mid = start + (end - start)/2;
if(array[mid] == k){
if((mid-1 < 0 || array[mid-1] < array[mid])) {
return mid;
}
end = mid - 1;
}else if(array[mid] < k){
start = mid + 1;
} else{
end = mid - 1;
}
}
return -1;
}
public int lastIndex(int[] array, int k){
int start = 0, end = array.length-1;
while(start <= end){
int mid = start + (end - start)/2;
if(array[mid] == k){
if((mid+1 >= array.length || array[mid+1] > array[mid])) {
return mid;
}
start = mid + 1;
}else if(array[mid] < k){
start = mid + 1;
} else{
end = mid - 1;
}
}
return -1;
}
}
时间复杂度O(n),空间复杂度O(1)