小插曲—二分法

步骤

  • 初始化左右指针 p l , p r pl, pr pl,pr
  • 取中间索引 m i d = i n t ( p l + p r ) / 2 mid = int(pl+pr)/2 mid=int(pl+pr)/2
  • 根据 n u m s [ m i d ] nums[mid] nums[mid] 判断下次的查找区间
  • 更新 p l , p r pl, pr pl,pr 回到第二步

写代码时存在的问题

  • m i d mid mid 的方法: 奇数/偶数
  • 循环条件: p l < p r plpl<pr or p l < = p r pl <=pr pl<=pr
  • p l , p r pl, pr pl,pr更新方法: p l = m i d + 1 / m i d , p r = m i d − 1 / m i d pl = mid+1/mid, pr = mid-1/mid pl=mid+1/mid,pr=mid1/mid

解释

  • 不用管当前区间是奇数还是偶数,正常找 m i d mid mid 就可以
  • 循环条件与左右指针更新方法:
    • 特殊的,假设找到最后左右指针相邻,此时算出的 m i d mid mid 一定指向左指针,所以区间的左边界一定能够被检查到,左指针的更新方法为 p l = m i d + 1 pl=mid+1 pl=mid+1
    • 同样假设找到最后左右指针相邻,且 t a r g e t target target 位于右指针位置
      • 当循环条件为 p l < p r plpl<pr 时,更新左指针后 p l = p r pl = pr pl=pr,循环退出,无法检查原右指针对应的数,也就是说当循环条件为 p l < p r plpl<pr 时, p r pr pr 处的数是不会检查的,如果采用 p r = m i d − 1 pr=mid-1 pr=mid1 的方式更新,则会导致漏检,因此右指针的更新方式为 p r = m i d pr=mid pr=mid (因为 m i d mid mid 处的数已经检查过了,不需要再检查了)
      • 当循环条件为 p l < = p r pl<=pr pl<=pr 时,更新左指针后 p l = p r pl = pr pl=pr,循环不会退出,可以检查原右指针对应的数,因此右指针的更新方式为 p r = m i d − 1 pr=mid-1 pr=mid1

你可能感兴趣的:(算法)