【算法详解】力扣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);
    }
};
相关推荐
fengfuyao9851 分钟前
基于拥挤距离的多目标粒子群优化算法 (MOPSO-CD)
算法
老鼠只爱大米2 分钟前
LeetCode经典算法面试题 #238:除自身以外数组的乘积(左右乘积数组法、分治法等多种方法详解)
算法·leetcode·分治法·算法面试·除自身以外数组的乘积·前缀乘积·左右乘积数组法
qianbo_insist10 分钟前
Mask R-CNN Fast-ReID 结合
人工智能·算法·cnn
lbb 小魔仙24 分钟前
【Java】基于 Java 的分布式系统实战:分布式锁 + 事务 + 一致性算法,干货满满
java·分布式·算法
朔北之忘 Clancy28 分钟前
第一章 顺序结构程序设计(3)
c++·算法·青少年编程·竞赛·教材·考级·讲义
Ethan-D28 分钟前
每日一题#21 二维 DP + 计数类
java·python·算法·leetcode·动态规划
飞Link31 分钟前
微调阶段中的模型自我提升、通用模型蒸馏和数据扩充
人工智能·算法·数据挖掘
共享家952732 分钟前
力扣刷题之路
算法·leetcode·深度优先
七夜zippoe38 分钟前
Python算法优化实战:时间与空间复杂度的艺术平衡
开发语言·python·算法·贪心算法·动态规划·复杂度