实现 int sqrt(int x)
函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
解题思路
首先可以想到的最简单的处理思路就是遍历[1,x]
的所有元素i
,计算相应的平方值,如果大于x
的话,我们返回i-1
即可。
class Solution:
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
for i in range(x+1):
if i**2 > x:
return i - 1
return x
但是这显然太过随意,时间复杂度太高。
对于数字查找这类问题,我们都可以使用二分搜索法。关于二分搜索法,我有一篇文章介绍的很详细Leetcode 二分法问题总结(超详细!!!),大家可以看看。对于这个问题我们实际上要找的是所有平方数小于x
里面最大的那个。
class Solution:
def mySqrt(self, x: int) -> int:
l, r = 0, x
while l < r:
mid = (l + r + 1) >> 1
if mid**2 <= x:
l = mid
else:
r = mid - 1
return l
其实,这个问题在数学上已经有很明确的解法了,就是大名鼎鼎的牛顿法。
首先,选择一个接近函数 f ( x ) f(x) f(x)零点的 x 0 x_0 x0,计算相应的 f ( x 0 ) f(x_0) f(x0)和切线斜率 f ′ ( x 0 ) f^{'}(x_0) f′(x0)(这里 f ′ f^{'} f