LeetCode 69. x的平方根
-
难度:简单
-
题目
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。
思路
算是暴力破解
如果是0或1就不用理会了,直接返回x
如果超过1,我们就拿x除以1..(X//2+1),因为一个数的平方根不可能超过X//2
如果一个x//i<=i,我们就找到这个边界值了。但是如果是=,返回的就是i,如果是<那么返回的是i-1
以4为例,4//2==2,返回的就是2
以5为例,5//3<3,返回的是2
参考代码
class Solution:
def mySqrt(self, x: int) -> int:
if x == 0 or x==1: return x
for i in range(1,x//2+1):#4只要计算到3,5计算到3(一半取整+1),7计算到4
result = i
if x//i<i: #
result = i-1 #如果7//3=2..1,2比3小,就把
break
elif x//i==i:
result = i
break
return result
官方解释
-
袖珍计算器
class Solution:
def mySqrt(self, x: int) -> int:
if x == 0:
return 0
ans = int(math.exp(0.5 * math.log(x)))
return ans + 1 if (ans + 1) ** 2 <= x else ans
-
二分查找
class Solution:
def mySqrt(self, x: int) -> int:
l, r, ans = 0, x, -1
while l <= r:
mid = (l + r) // 2
if mid * mid <= x:
ans = mid
l = mid + 1
else:
r = mid - 1
return ans
-
牛顿迭代
这个问题其实就是求f(x)=num - x ^ 2的零点。
已知牛顿法递推公式:Xn+1 = Xn - f(Xn)/f'(Xn).
带入f'(x) = -2x.
得: Xn+1 = Xn +(num - Xn ^ 2)/2Xn = (num + Xn ^ 2) / 2Xn = (num / Xn + Xn) / 2.
用代码表示则为num = (num + x / num) / 2.
class Solution:
def mySqrt(self, x: int) -> int:
if x == 0:
return 0
C, x0 = float(x), float(x)
while True:
xi = 0.5 * (x0 + C / x0)
if abs(x0 - xi) < 1e-7:
break
x0 = xi
return int(x0)class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
num = x
while num * num > x:
num = (num + x / num) / 2
return num -

浙公网安备 33010602011771号