题目描述
统计一个数字在排序数组中出现的次数。
排序数组,所以相比顺序,用二分更高效
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int len=array.length;
int l=0,r=len-1;
int num=0;
while(l<=r){
int mid=l+(r-l)/2;
if(k>array[mid]){
l=mid+1;
}else if(k<array[mid]){
r=mid-1;
}else{
num=howMuch(array,mid,k);
break;
}
}
return num;
}
public int howMuch(int [] array,int mid,int k){
int num=1,l=mid-1,r=mid+1;
while(l>=0&&array[l]==k){
num++;
l--;
}
while(r<array.length&&array[r]==k){
num++;
r++;
}
return num;
}
}
更新颖高效的解法,在二分基础之上的扩展
因为data中都是整数,所以可以稍微变一下,不是搜索k的两个位置,而是搜索k-0.5和k+0.5
这两个数应该插入的位置,然后相减即可。
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int len=array.length;
int l=findIndex(len,array,(double)k-0.5);
int r=findIndex(len,array,(double)k+0.5);
return r-l;
}
public int findIndex(int len,int[] array,double target){
int l=0,r=len-1;
while(l<=r){
int mid=l+(r-l)/2;
if((double)array[mid]<target){
l=mid+1;
}else if((double)array[mid]>target){
r=mid-1;
}
}
return l;
}
}