题目描述
统计一个数字在排序数组中出现的次数。
思路:看到有序数组,第一反应就该想到能否用二分法解决,这样直接将算法时间复杂度降到logn级别。
本题我们用二分查找找到数字在数组中第一次出现的位置和数字在数组中最后一次出现的位置,二者相减即可。
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array.length==0)
return 0;
int firstIndexOfK=findFirstIndexOfK(array,k);
int lastIndexOfK=findLastIndexOfK(array,k);
if(firstIndexOfK!=-1&&lastIndexOfK!=-1){
return lastIndexOfK-firstIndexOfK+1;
}
return 0;
}
private int findFirstIndexOfK(int[] array,int k){
int low=0,high=array.length-1;
while(low<=high){
int mid=low+(high-low)/2;
if(array[mid]<k){
low=mid+1;
}else{
high=mid-1;
}
}
return low;
}
private int findLastIndexOfK(int[] array,int k){
int low=0,high=array.length-1;
while(low<=high){
int mid=low+(high-low)/2;
if(array[mid]>k){
high=mid-1;
}else{
low=mid+1;
}
}
if(high>=0&&array[high]==k)
return high;
return -1;
}
}