【算法详解】力扣69.x的平方根

发布时间:2024年01月20日

一、题目描述

力扣链接:力扣69.x的平方根

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

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

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

二、思路分析

可以使用二分查找法来逼近一个数的平方根

class Solution {
public:
    int mySqrt(int x) {
        int left = 0, right = x, result = 0;

        while (left <= right) {
            int mid = (left + right) >> 1;

            if ((long long)mid * mid <= x) {
                result = mid;
                left = mid + 1;
            }
            else {
                right = mid - 1;
            }
        }

        return result;
    }
};

牛顿迭代法是一种用于寻找方程根的数值方法,它可以用来求解平方根。对于求解方程 f(x) = 0,牛顿迭代法的迭代公式为:

x n + 1 = x n ? f ( x n ) f ‘ ( x n ) x_{n+1}=x_{n}-\frac{f(x_n)}{f^`(x_n)} xn+1?=xn??f(xn?)f(xn?)?

对于求解 x = 0 \sqrt{x}=0 x ?=0,则可以令 f ( x ) = x 2 ? a f(x)=x^2-a f(x)=x2?a其中 a 是要求平方根的非负整数。

那么迭代公式就变为:

x n + 1 = 0.5 ? ( x n + f ( x n ) f ‘ ( x n ) ) x_{n+1}=0.5*(x_{n}+\frac{f(x_n)}{f^`(x_n)}) xn+1?=0.5?(xn?+f(xn?)f(xn?)?)

那么可以写出C++代码

class Solution {
public:
    int mySqrt(int x) {
        if (x == 0 || x == 1) {
            return x;
        }

        double result = x;
        double epsilon = 1e-6;

        while (fabs(result * result - x) > epsilon) {
            result = 0.5 * (result + x / result);
        }
        return static_cast<int>(result);
    }
};
文章来源:https://blog.csdn.net/HearMeRoar_/article/details/135721592
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。