有两种解法:
1.使用模拟法
2.使用二分法
/**
* @author xienl
* @description 数字在升序数组中出现的次数
* @date 2022/6/29
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
int[] nums = {1,2,3,3,3,3,4,5};
System.out.println(solution.binary(nums, 3));
}
/**
* 使用模拟,一步到位
* @param array
* @param k
* @return
*/
public int GetNumberOfK(int [] array , int k) {
if (array.length == 0 || array[array.length - 1] > k || array[0] < k){
return 0;
}
int ans = 0;
for (int i = 0; i < array.length; i ++){
if (array[i] == k){
ans++;
}
if (array[i] > k){
break;
}
}
return ans;
}
/**
* 使用二分法解决
* 需要找到 k 出现的个数,那么正常的二分查找,只能找到某一个k出现的位置,
* 那么如果我们找到 k+ 0.5 或者 k-0.5的位置的数,减一下就是我们的结果
* @param array
* @param k
* @return
*/
public int binary(int [] array , int k) {
return calculation(array, k + 0.5) - calculation(array, k - 0.5);
}
private int calculation(int [] array , double k){
int left = 0, right = array.length - 1;
while (left <= right){
int mid = (left + right) >> 1;
if (array[mid] > k){
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
}
}
这篇博客探讨了如何在有序数组中统计某个数字出现的次数。作者提供了两种解决方案:一是使用模拟法,遍历数组直到找到大于目标数字的元素;二是利用二分法,通过找到目标数字上下界的索引差来计算出现次数。代码实现清晰,适合学习数据查找算法。

被折叠的 条评论
为什么被折叠?



