为何LeetCode求x平方根的二分查找代码返回值需区分处理?
理解二分查找求平方根的循环后返回逻辑
先明确核心目标:我们要找的是最大的整数n,满足n² ≤ x,因为题目要求截断小数部分。你的代码里,循环内如果找到完全匹配的平方根(sqrt*sqrt ==x)会直接返回,剩下的非完全平方数场景,就需要在循环结束后处理。
循环终止的核心条件
当min > max时,循环停止。这说明所有可能的整数范围已经排查完毕,没有找到完全等于x平方根的数,此时需要判断最后一次计算的sqrt和目标答案的关系。
循环结束时的两种典型场景
用具体例子拆解更直观:
场景1:最后一次计算的sqrt平方大于x
比如x=8(目标答案是2):
- 最后一轮循环:
min=3,max=3,计算sqrt=3,3²=9>8,于是执行max=sqrt-1=2,此时min=3>max=2,循环结束。 - 这时候
sqrt=3的平方比x大,说明真正的答案是sqrt-1=2——2是最大的满足2²≤8的整数。
场景2:最后一次计算的sqrt平方小于x
比如x=6(目标答案是2):
- 最后一轮循环:
min=2,max=2,计算sqrt=2,2²=4<6,于是执行min=sqrt+1=3,此时min=3>max=2,循环结束。 - 这时候
sqrt=2的平方比x小,而且sqrt+1=3的平方肯定大于x(不然循环不会终止),所以sqrt就是我们要找的答案。
对应代码里的返回逻辑
代码里的return sqrt*sqrt > x ? sqrt-1: sqrt;就是直接对应上面两种场景:
- 如果最后一次的
sqrt平方大于x,说明它比目标答案大1,返回sqrt-1; - 如果平方小于x,说明它就是目标答案,直接返回
sqrt。
这样就能准确得到截断小数后的整数平方根。
内容的提问来源于stack exchange,提问作者Sofia Ayala
相关产品推荐
相关产品推荐

