【无标题】

LeetCode 69. x 的平方根

跳转链接

  • 题目描述:

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

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

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

  • 示例

示例1
输入:x = 4
输出:2

示例2
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
  • 解析

- 不用求小数部分,用二分法是比较好的选择
	- 二分法是找n*n<=x的最大的n,所以在折半时,要将当前的left记录下来ans
	- 若下一步结果大于x,则ans即为答案
- 老是忘记牛顿法,复习一下
	- 题目求算数平方根,即x^2 = C ==>即求y=x^2-C的零点,其中C为输入值
	- 牛顿迭代就是从初始值开始,向零点逼近的过程。
	- 先随机选择初始点x0,过(x0,y0)做一条切线,斜率为(x^2-C)'=2x0,则切线方程为y-y0=2x0(x-x0)
	- ===>y-(x0^2-C)=2x0(x-x0) ===>y=2x0x-2x0^2+x0^2-C,
	- y=0时与坐标轴的切点为x=(x0^2+C)/2x0
	- 到此,推出下一个迭代点x1,不断迭代,当xn≈x(n+1)时,结束迭代
  • 代码

class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        m0 = x
        m1 = m0 + x / m0
        while abs(m0 - m1) > 1e-7:
            m0 = m1
            m1 = (m0 + x / m0) / 2
        return int(m0)
  • 官解

二分法

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

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

牛顿法

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)

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/sqrtx/solution/x-de-ping-fang-gen-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(每日一题LeetCode,leetcode,算法,职场和发展)