二分查找简单递归与非递归实现
二分查找应用场景的局限性
解答开篇
小结
思考
LeetCode 69-x的平方根 及 扩展
注意几个隐含规律即可:
- 一个数的平方根肯定不会超过它自己.
- 一个数的平方根最多不会超过它的一半,所以我们在low=0,high=x/2这个范围里找该数的平方根!
- 某数的平方如果小于目标数,该数+1 的平方如果大于目标数,那么该数就是我们要的整数。
上代码:
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
if x == 1:
return 1
low = 0
high = x/2
while (low <= high):
mid = low + ((high-low)>>1)
nextnum = (mid+1)*(mid+1)
if mid*mid == x or (mid*mid<x and nextnum>x):
return mid
elif mid*mid < x:
low = mid + 1
else:
high = mid - 1
扩展:
- 如果是保留小数点后六位,那么代码中return mid的条件可以变为
若(mid+0.000001)(mid+0.000001)>x 且 (mid-0.000001)(mid-0.000001)<x,则return mid - high = x/2.0 # Python2必须加小数点,Python3直接就是小数结果,代码中的数据要直接取小数,而非整数。
- mid*mid 大于小于x时,不要用1进行调整,而是直接令其等于mid,从而通过1中的条件进行收敛判断。