53 数字在升序数组中出现的次数
描述
给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数
由于是排序数组,可以使用二分查找找出 k 的最左位置和最右位置,时间复杂度 o(log n) ,空间复杂度 o(1 )
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array==null || array.length==0) return 0;
int left=findFirstK(array, k, 0, array.length-1);
if(left==-1) return 0;
int right=findLastK(array, k, left, array.length-1);
return right-left+1;
}
private int findFirstK(int[] array, int k, int begin, int end){
while(begin<end){
int mid=(begin+end)/2;
int t=array[mid];
if(t>=k){
end=mid;
} else {
begin=mid+1;
}
}
if(array[end]==k) return end;
return -1;
}
private int findLastK(int[] array, int k, int begin, int end){
while(begin<end){
int mid=(begin+end+1)/2;
int t=array[mid];
if(t<=k){
begin=mid;
} else {
end=mid-1;
}
}
if(array[begin]==k) return begin;
return -1;
}
}