当前位置:   article > 正文

每日一题 — 在排序数组中查找元素的第一个和最后一个位置

每日一题 — 在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

 思路:当查找该元素的最左侧位置时,如下图:

我们首先需要判断情况:

  • 当mid < target 的时候:mid在左边这个区间里面,无法求出结果,所以让left右移,   left = mid+1;
  • 当mid >= target 的时候:mid在右边这个区间里面,mid也有可能刚好等于target,我们得缩小范围,所以  right = mid(不能等于mid-1,否则如果mid刚好等于target的时候,right = mid-1 之后,就无解了);

细节处理:

  1. 循环条件选择:
    left < right
    left <= right

    在求最左侧端点的时候,我们采用第一种循环条件,如果使用第二种循环条件,会导致死循环

  2. mid有两种求法:
    mid = left +(right - left)/ 2  — 求出的值会偏左
    mid = left +(right - left + 1)/ 2  —求出的值会偏右
    在求最左侧位置的时候,只能使用第一种方法,因为使用第二种方法会导致死循环

    当只剩下两个数判断且 mid = target 的时候,此时如果right = mid,这个两个数的的mid一直等于right,而right又等于 mid,陷入死循环

 






同理当查找该元素的最右侧位置时,如下图:

我们首先需要判断情况:

  • 当mid <= target 的时候:mid在左边这个区间里面,mid可能刚好等于target,所以让left右移的时候需要注意不能加一,否则会导致无解,left = mid;
  • 当mid > target 的时候:mid在右边这个区间里面,无法求出结果,我们得缩小范围,所以 right = mid-1;

细节处理:

  1.  循环条件选择:
    left < right
    left <= right

    在求最左侧端点的时候,我们采用第一种循环条件,如果使用第二种循环条件,会导致死循环

  2. mid有两种求法:
    mid = left +(right - left)/ 2  — 求出的值会偏左
    mid = left +(right - left + 1)/ 2  —求出的值会偏右
    在求最左侧位置的时候,只能使用第二种方法,因为使用第一种方法会导致死循环

    当只剩下两个数判断且 mid = target 的时候,此时如果left = mid,这个两个数的的mid一直等于left,而left又等于 mid,陷入死循环

代码:

  1. class Solution {
  2. public int[] searchRange(int[] nums, int target) {
  3. int[] ret = new int[2];
  4. ret[0] = -1;
  5. ret[1] = -1;
  6. if(nums.length == 0){
  7. return ret;
  8. }
  9. int left = 0;
  10. int right = nums.length - 1;
  11. //判断左端点
  12. while(left < right){
  13. int mid = left + (right - left) / 2;
  14. if(nums[mid] < target){
  15. left = mid+1;
  16. }else{
  17. right = mid;
  18. }
  19. }
  20. //判断是否等于目标值
  21. if(nums[left] != target){
  22. return ret;
  23. }else{
  24. ret[0] = left;
  25. }
  26. left = 0;
  27. right = nums.length - 1;
  28. //判断右端点
  29. while(left < right){
  30. int mid = left + (right - left + 1) / 2;
  31. if(nums[mid] <= target){
  32. left = mid;
  33. }else{
  34. right = mid-1;
  35. }
  36. }
  37. //判断是否等于目标值
  38. if(nums[left] != target){
  39. return ret;
  40. }else{
  41. ret[1] = left;
  42. }
  43. return ret;
  44. }
  45. }

总结模板:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/593674
推荐阅读
相关标签
  

闽ICP备14008679号