《剑指offer》刷题——【时间效率与空间效率的平衡】面试题53:数字在排序数组中出现的次数(java实现)
一、题目描述
统计一个数字在排序数组中出现的次数。
二、题目分析
方法一:遍历
- 遍历一边数组
- 比较每一个数字
- 统计指定数字出现的次数
- 时间复杂度:O(n)
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int count = 0;
for(int i=0; i<array.length; i++){
if(k==array[i]){
count++;
}
}
return count;
}
}
方法二:二分法
- 通过二分法找到该数字的起始地址、结束地址
- 次数 = 结束地址-起始地址
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array==null || array.length==0 || k<0){
return 0;
}
int startIndex = -1;
int endIndex = -1;
startIndex = getStartIndex(array, k, 0, array.length-1);
endIndex = getEndIndex(array, k, 0, array.length-1);
if(startIndex!=-1 && endIndex != -1){
return (endIndex-startIndex+1);
}
return 0;
}
public int getStartIndex(int[] array, int k, int start, int end){
if(start > end){
return -1;
}
int mid = start + ((end-start)>>1);
if(array[mid]<k){
return getStartIndex(array, k, mid+1, end);
}
else if(array[mid]>k){
return getStartIndex(array, k, start, mid-1);
}
else if(mid-1>=0 && array[mid-1]==k){
return getStartIndex(array, k, start, mid-1);
}
else{
return mid;
}
}
public int getEndIndex(int[] array, int k, int start, int end){
int len = array.length;
int mid = start +((end-start)>>1);
while(start <= end){
if(array[mid]<k){
start = mid +1;
}
else if(array[mid]>k){
end = mid -1;
}
else if(mid+1<len && array[mid+1]==k){
start = mid+1;
}
else{
return mid;
}
mid = start + ((end-start)>>1);
}
return -1;
}
}