【算法详解】力扣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);
    }
};
相关推荐
handler0110 小时前
算法:图的基本概念
c语言·开发语言·c++·笔记·算法·图论
科研前沿10 小时前
像素即坐标・室外无边界:2026 最新无感定位技术,驱动数字孪生实景可控—— 镜像视界技术白皮书
大数据·人工智能·算法·重构·空间计算
少许极端10 小时前
算法奇妙屋(五十)-二分与双指针的结合 + 2024秦皇岛-Problem D
算法·二分+双指针
love在水一方10 小时前
【Voxel-SLAM】 体素地图与Bundle Adjustment算法深度分析(四)
人工智能·算法·机器学习
阿Y加油吧10 小时前
二刷 LeetCode:198. 打家劫舍 & 279. 完全平方数 复盘笔记
笔记·算法·leetcode
承渊政道10 小时前
【动态规划算法】(子序列问题解题框架与典型案例)
数据结构·c++·学习·算法·leetcode·macos·动态规划
阿Y加油吧10 小时前
二刷 LeetCode:215. 数组中的第 K 个最大元素 & 347. 前 K 个高频元素 复盘笔记
笔记·leetcode·排序算法
_F_y10 小时前
仿RabbitMQ实现消息队列-服务端核心模块实现(3)
c++·算法·rabbitmq
m0_6294947310 小时前
LeetCode 热题 100-----15.轮转数组
数据结构·算法·leetcode
AI科技星10 小时前
从180°旋转定值π、e论证时空宿命与未来可预测性—全域数学视角
人工智能·算法·机器学习·数学建模·数据挖掘