一、题目
统计一个数字在排序数组中出现的次数。
二、思路
解法一:遍历数组计数
解法二:考虑到时有序数组,所以采用分查找,找到第一个K 和 最后一个K的位置, 二者相减。
三、代码
解法一:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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; }
解法二:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class Solution2 { public int GetNumberOfK(int[] array, int k) { int lower = getLower(array, k); int upper = getUpper(array, k); return upper - lower + 1; } //获取k第一次出现的下标 public int getLower(int[] array, int k) { int start = 0, end = array.length - 1; int mid = (start + end) / 2; while (start <= end) { if (array[mid] < k) { start = mid + 1; } else { end = mid - 1; } mid = (start + end) / 2; } return start; } //获取k最后一次出现的下标 int getUpper(int[] array, int k) { int start = 0, end = array.length - 1; int mid = (start + end) / 2; while (start <= end) { if (array[mid] <= k) { start = mid + 1; } else { end = mid - 1; } mid = (start + end) / 2; } return end; } }
---------------------------------------------
参考链接:
https://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2