题目链接

题目描述

统计一个数字在升序数组中出现的次数。

解题思路

  1. 利用二分查找,找到任意一个 k
  2. 由于 k 有多个,并且 当前找到的 k 可能在任意位置 。所以, 在当前 k 的前后进行遍历查找

示例

  1. 输入:
  2. {1,2,3,3,3,3,4,5} 3
  3. 输出:
  4. 4

代码

  1. public int GetNumberOfK(int [] array , int k) {
  2. if (array == null || array.length == 0) {
  3. return 0;
  4. }
  5. //二分查找
  6. int start = 0, end = array.length - 1;
  7. int t = -1;
  8. while (start <= end) {
  9. int mid = (start + end) / 2;
  10. if (array[mid] == k) {
  11. t = mid;
  12. break;
  13. } else if (array[mid] > k) {
  14. end = mid - 1;
  15. } else {
  16. start = mid + 1;
  17. }
  18. }
  19. // 如果查找的数字不在数组中
  20. if (t == -1) {
  21. return 0;
  22. }
  23. // 此时通过二分查找已经找到了其实一个
  24. // sum用来统计总共的个数,是最后返回的值
  25. int sum = 0;
  26. //左侧
  27. // t 保存的为已经找到数组的索引
  28. int a = t;
  29. while (a >= 0 && array[a] == k) {
  30. sum++;
  31. a--;
  32. }
  33. //右侧
  34. a = t + 1;
  35. while (a < array.length && array[a] == k) {
  36. sum++;
  37. a++;
  38. }
  39. return sum;
  40. }

补充

二分查找