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

一、题目描述

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

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

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

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

二、思路分析

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

cpp 复制代码
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++代码

cpp 复制代码
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);
    }
};
相关推荐
tqs_123455 分钟前
倒排索引数据结构
java·前端·算法
a程序小傲9 分钟前
听说前端又死了?
开发语言·前端·mysql·算法·postgresql·深度优先
副露のmagic9 分钟前
python基础复健
python·算法
bclshuai13 分钟前
深度学习算法辅助股票分析
人工智能·深度学习·算法
mit6.82415 分钟前
437贪心
算法
hetao173383715 分钟前
2026-01-19~20 hetao1733837 的刷题笔记
c++·笔记·算法
秋刀鱼程序编程36 分钟前
Java编程基础入门(四)---选择循环语句
java·开发语言·算法
wen__xvn38 分钟前
基础算法集训第04天:选择排序和冒泡排序
数据结构·算法·leetcode
充值修改昵称1 小时前
数据结构基础:二叉树高效数据结构的奥秘
数据结构·python·算法
啊阿狸不会拉杆1 小时前
《机器学习》第四章-无监督学习
人工智能·学习·算法·机器学习·计算机视觉