leetcode69:x的平方根

leetcode:69题 x的平方根

题目描述:

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

示例 1:

1
2
输入: 4
输出: 2

示例 2:

1
2
3
4
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,
由于返回类型是整数,小数部分将被舍去。

作者:liweiwei1419
链接:https://leetcode-cn.com/problems/sqrtx/solution/er-fen-cha-zhao-niu-dun-fa-python-dai-ma-by-liw

解题思路:

一、二分法

思路分析:

二分查找法应用于搜索平方根的思想很简单,其实就是“猜”,但是是有策略的“猜”,用“排除法”在有限的区间里,一次排除一半的区间元素,最后只剩下一个数,这个数就是题目要求的向下取整的平方根整数。

一个数的平方根肯定不会超过它自身,不过直觉还告诉我们,一个数的平方根最多不会超过它的一般。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def mySqrt(self, x: int) -> int:
if x == 0:
return 0
left = 1
right = x//2
while left<right:
mid = (left + right+1)>>1
if (mid * mid) > x:
right = mid - 1
else:
left = mid
return left

二、牛顿法

使用牛顿法可以得到一个正实数的算术平方根,因为题目中说“结果只保留整数部分”,因此,我们把使用牛顿法得到的浮点数转换为整数即可。

这里给出牛顿法的思想:

在迭代过程中,以直线代替曲线,用一阶泰勒展式(即在当前点的切线)代替原曲线,求直线与 xx 轴的交点,重复这个过程直到收敛。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:

def mySqrt(self, x):
if x < 0:
raise Exception('不能输入负数')
if x == 0:
return 0
# 起始的时候在 1 ,这可以比较随意设置
cur = 1
while True:
pre = cur
cur = (cur + x / cur) / 2
if abs(cur - pre) < 1e-6:
return int(cur)
Contents
  1. 1. leetcode:69题 x的平方根
|