当前位置:网站首页>leetcode:69. x 的平方根

leetcode:69. x 的平方根

2022-08-11 07:00:00 uncle_ll

69. x 的平方根

来源:力扣(LeetCode)

链接: https://leetcode.cn/problems/sqrtx/

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

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

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

示例 1:

输入:x = 4
输出:2

示例 2:

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

提示:

  • 0 <= x <= 2 31 − 1 2^{31} - 1 2311

解法

  • 库函数:这种一般解题的话不让用库函数
  • 循环:从1开始训练遍历,求n*n与x的关系
  • 二分法:通过二分法加速遍历寻找
  • 牛顿法:数学公式推导
    在这里插入图片描述

代码实现

遍历

python实现

class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0:
            return 0
        
        n = 1
        while n * n <= x:
            n += 1
        return n-1

c++实现

class Solution {
    
public:
    int mySqrt(int x) {
    
        if ( x == 0 || x == 1)
            return x;
        
        long int n = 1;
        while (n * n <= x) {
    
            n++;
        }
        return n-1;
    }
};

复杂度分析

  • 时间复杂度: O ( N ) O(N) O(N)
  • 空间复杂度: O ( 1 ) O(1) O(1)

二分法

python实现

class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0:
            return 0
        
        right = x
        left = 0
        while left <= right:
            mid = left + (right-left) // 2
            if mid * mid < x:
                left = mid + 1
            elif mid * mid == x:
                return mid
            elif mid * mid > x:
                right = mid - 1
        return min(left, right)

c++实现

class Solution {
    
public:
    int mySqrt(int x) {
    
        if (x == 0 || x == 1)
            return x;
        
        long int left = 0;
        long int right = x;
        while (left <= right) {
    
            long int mid = left + (right-left) / 2;
            if (mid * mid == x)
                return mid;
            else if (mid * mid < x) {
    
                left = mid + 1;
            }
            else if (mid * mid > x) {
    
                right = mid - 1;
            }
        }
        return min(left, right);
    }
};

复杂度分析

  • 时间复杂度: O ( l o g N ) O(logN) O(logN)
  • 空间复杂度: O ( 1 ) O(1) O(1)

牛顿法

  • python实现
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)
  • c++实现
class Solution {
    
public:
    int mySqrt(int x) {
    
        if (x == 0) {
    
            return 0;
        }

        double C = x, x0 = x;
        while (true) {
    
            double xi = 0.5 * (x0 + C / x0);
            if (fabs(x0 - xi) < 1e-7) {
    
                break;
            }
            x0 = xi;
        }
        return int(x0);
    }
};

复杂度分析

  • 时间复杂度: O ( l o g N ) O(logN) O(logN) , 但还是比二分法要快
  • 空间复杂度: O ( 1 ) O(1) O(1)

参考

原网站

版权声明
本文为[uncle_ll]所创,转载请带上原文链接,感谢
https://blog.csdn.net/uncle_ll/article/details/126276664