题目描述
统计一个数字在排序数组中出现的次数。
解题思路
方法一:顺序遍历。从前向后依次遍历数组,统计指定数字出现的次数,最终返回即可。
时间复杂度:O(n);空间复杂度:O(1)
源码
public class Solution {
public int GetNumberOfK(int [] array , int k) {
//特殊处理
if(array == null || array.length == 0 || k 0] || k > array[array.length-1]){
return 0;
}
//count为K出现的次数
int count = 0;
for(int i = 0; i if(array[i] == k){
count++;
}
}
return count;
}
}
运行结果
方法二:二分查找。进行两次二分查找,第一次确定目标值的右边界,第二次确定目标值-1的右边界,最终两次右边界做差即返回目标元素的个数。如下图所示:
目标元素8的个数即为5-2 = 3个。
时间复杂度:O(logn);空间复杂度:O(1)
源码
public class Solution {
public int GetNumberOfK(int [] array , int k) {
//特殊处理
if(array == null || array.length == 0 || k 0] || k > array[array.length-1]){
return 0;
}
//right2 - right1
return helper(array,k) - helper(array, k-1);
}
public int helper(int[] array,int target){
//该方法为一次二分查找:确定左边界和右边界
int left = 0, right = array.length - 1;
while(left <= right){
int mid = (left + right) / 2;
if(array[mid] <= target){
//目标元素在右边
left = mid + 1;
}else{
right = mid - 1;
}
}
return left;
}
}