【算法详解】力扣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);
    }
};
相关推荐
合兴软件@8 分钟前
合兴软件重磅推出高性能HSM固件 国密算法赋能汽车信息安全新防线
网络·算法·网络安全·汽车·信息与通信
wearegogog12323 分钟前
基于遗传算法的阵列天线方向图优化MATLAB实现
算法·matlab
Controller-Inversion33 分钟前
312. 戳气球
算法
图码33 分钟前
最大子数组和问题:从暴力到Kadane算法的优雅蜕变
数据结构·算法·动态规划·柔性数组
Raink老师36 分钟前
用100道题拿下你的算法面试(链表篇-5):删除链表的倒数第 N 个节点
算法·链表·面试
qq_2965532739 分钟前
[特殊字符] 数组中的递增三元组:O(n) 时间高效查找,面试必考!
数据结构·算法·面试·职场和发展·组合模式·柔性数组
今儿敲了吗1 小时前
链表篇(一)——合并两个有序链表
数据结构·笔记·算法·链表
fie88891 小时前
基于BBO算法的网络负载均衡优化(MATLAB实现)
网络·算法·负载均衡
y = xⁿ1 小时前
20天速通LeetCodeday11:二叉树进阶
数据结构·算法
400分1 小时前
langchain踩坑调用大模型记录-搭建人工智能机器人
算法