步骤
- 初始化左右指针 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 pl<pr pl<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=mid−1/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 pl<pr pl<pr 时,更新左指针后 p l = p r pl = pr pl=pr,循环退出,无法检查原右指针对应的数,也就是说当循环条件为 p l < p r pl<pr pl<pr 时, p r pr pr 处的数是不会检查的,如果采用 p r = m i d − 1 pr=mid-1 pr=mid−1 的方式更新,则会导致漏检,因此右指针的更新方式为 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=mid−1