一、题目内容

image.png

二、题解

解法1:

思路

两轮二分法查找。
image.png
image.png
image.png

代码

  1. class Solution {
  2. public int search(int[] nums, int target) {
  3. int i = 0;
  4. int j = nums.length - 1;
  5. // 搜索右边界 right
  6. while (i <= j) {
  7. int m = (j + i) / 2;
  8. if (nums[m] <= target) {
  9. i = m + 1;
  10. } else {
  11. j = m - 1;
  12. }
  13. }
  14. //当前数组中无target
  15. if (j > 0 && nums[j] != target) {
  16. return 0;
  17. }
  18. //存储right
  19. int right = i;
  20. // 搜索左边界 right
  21. // 恢复i、j
  22. i = 0;
  23. j = nums.length - 1;
  24. while (i <= j) {
  25. int m = (j + i) / 2;
  26. //此处是 < 而不是 <=
  27. if (nums[m] < target) {
  28. i = m + 1;
  29. } else {
  30. j = m - 1;
  31. }
  32. }
  33. int left = j;
  34. return right - left - 1;
  35. }
  36. }

解法2:

思路

两轮二分法查找。
因为原数组为升序数组,则可以代码优化,转化为求 target与target-1的第一个右节点

代码

  1. class Solution {
  2. public int search(int[] nums, int target) {
  3. return searchTargetRight(nums, target) - searchTargetRight(nums, target - 1);
  4. }
  5. public int searchTargetRight(int[] nums, int target) {
  6. int i = 0;
  7. int j = nums.length - 1;
  8. // 搜索右边界 right
  9. while (i <= j) {
  10. int m = (j + i) / 2;
  11. if (nums[m] <= target) {
  12. i = m + 1;
  13. } else {
  14. j = m - 1;
  15. }
  16. }
  17. return i;
  18. }
  19. }