题目描述
统计一个数字在排序数组中出现的次数。
- 暴力遍历
看到这里首先想到的就是暴力遍历,时间复杂度是n
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;
}
}
- 二分查找
因为数组是有序的,所以想到二分查找,但是需要统计次数,二分查找到之后处理起来并不简单。
在考虑到原数组是整数的,所以可以把查找的数分别加减0.5,找到加减后两个数在数组中应该插入的位置,两者相减即为所要找的数出现的次数。
时间复杂度是O(log2n)
public class Solution {
public int GetNumberOfK(int [] array , int k) {
return findIndex(array, k + 0.5) - findIndex(array, k - 0.5);
}
public static int findIndex(int [] array, double k){
int start = 0, end = array.length - 1;
while(start <= end){
int mid = (end + start) / 2;
if(array[mid] < k){
start = mid + 1;
}else if(array[mid] > k){
end = mid - 1;
}
}
return start;
}
}