统计一个数字在排序数组中出现的次数。
/** * 暴力解法,不管有序还是无序直接全部遍历 * 时间复杂度:O(N) * 空间复杂度:O(1) * @param array * @param k * @return */public int getNumberOfK1(int[] array, int k) { int count = 0; for (int i = 0; i < array.length; i++) { if (array[i] == k) { count++; } } return count;}
虽然说使用暴力解法很爽,但是我们不能忽略到题目所给的提示,它是一个有序的数组,这样的话,其实我们可以使用二分查找,找到其值的上界和下界。然后用上界减去下界就可以了。因为这个是用到了二分法,担心有一些小伙伴不是很熟悉二分法,因此在下一篇文章中着重讲解了下二分法。
public static void main(String[] args) { int[] array = {1, 2, 2, 2, 4}; int result = getNumberOfK2(array,2); System.out.println("result = [" + result + "]"); } public static int getNumberOfK3(int[] array, int k) { int left = left_bound(array,k); int right = right_bound(array,k); return right-left; } //左边界 public static int left_bound(int[] array, int target) { int left = 0; int right = array.length; //注意 while (left < right) { //注意 int mid = (left + right) / 2; if (array[mid] < target) { left = mid + 1; } else if (array[mid] > target) { right = mid; //注意 } else { right = mid; } } return left; } //右边界 public static int right_bound(int[] array, int target) { int left = 0; int right = array.length; //注意 while (left < right) { //注意 int mid = (left + right) / 2; if (array[mid] < target) { left = mid + 1; } else if (array[mid] > target) { right = mid;//注意 } else { left = mid + 1; } } return right; }
结果:
ps: 想要查看之前的文章都已经保存
- THE END -
作者简介
![bf4559e584e410892a5bf287ad6d4eed.png](https://i-blog.csdnimg.cn/blog_migrate/0a687be26d80067942e63dd4f5a44506.jpeg)
Mr.W
白天搬砖,晚上砌梦想。
相信每个人有故事,程序员更是有许多事故,书写最接地气的程序员故事,为大家找出更好的资料。