一、题目描述
统计一个数字在排序数组中出现的次数。
二、思路分析及代码实现
方法一:暴力查找法
时间复杂度:o(n)
空间复杂度: , o(1)
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int count=0;
for(int i=0;i<array.length;i++){
if(array[i]==k)
count++;
}
return count;
}
}
方法二:利用排序减少查找次数
import java.util.Arrays;
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int count=1;
int index=Arrays.binarySearch(array,k);
if(index<0) return 0;
for(int i=index+1;i<array.length;i++){
if(array[i]==k){
count++;
}else{
break;
}
}
for(int j=index-1;j>=0;j--){
if(array[j]==k)count++;
else
break;
}
return count;
}
}
方法三:二分查找
- 方法中默认数组为从小到大排序。
- 找到上界和下界,做差即可。
public class Solution {
public int GetNumberOfK(int [] array , int k) {
//利用二分查找法找到上界和下界
if(array==null||array.length==0){
return 0;
}
int upper=getUpper(array,k);
int lower=getLower(array,k);
return upper-lower;
}
public int getUpper(int[] array, int k){
int l=0, r=array.length-1,mid;
while(l<=r){
mid=(l+r)/2;
if(array[mid]<=k){
l=mid+1;
}else
r=mid-1;
}
return l;
}
public int getLower(int[] array, int k){
int l=0, r=array.length-1,mid;
while(l<=r){
mid=(l+r)/2;
if(array[mid]>=k){
r=mid-1;
}else
l=mid+1;
}
return l;
}
}