算法leetcode|69. x 的平方根(rust重拳出击)


文章目录


69. x 的平方根:

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

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

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

样例 1:

复制代码
输入:
	
	x = 4
	
输出:
	
	2

样例 2:

复制代码
输入:
	
	x = 8
	
输出:
	
	2
	
解释:
	
	8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示:

  • 0 <= x <= 231 - 1

分析:

  • 面对这道算法题目,二当家的再次陷入了沉思。
  • 要开平方,但是不允许使用内置的指数函数,这是故意难为我胖虎。
  • 暴力破解,反正只要整数,从 1 到 x ,一个一个试,就能找到最接近的解,很简单,但是过于简单了,一定还有更好的办法。
  • 答案只要整数,从线性连续的数值里找最优,想到可以用二分法,不断尝试,二分的效率很高,每次都能减少一半的数据量,已经可以满意了。
  • 还有一个更好的办法,答案要的是近似的整数,所以还可以使用 牛顿迭代法 ,非常适合高效找到近似解,听说效率比二分还高。
  • 感觉数学还是厉害啊,很多东西都是可以用数学的方法高效解决的,虽然计算机已经很快了,但是很多时候用数学的方式去解决,可以快很多,很想学好数学。
  • 下面的题解都是使用 牛顿迭代法,找近似解,所以需要有个度,一个停止继续的点,一般认为两次连续求得的解的差非常小的时候,就是应该停止的时候。

题解:

rust:

rust 复制代码
impl Solution {
    pub fn my_sqrt(x: i32) -> i32 {
        if x == 0 {
            return 0;
        }

        let (c, mut x0) = (x as f64, x as f64);
        loop {
            let xi = 0.5 * (x0 + c / x0);
            if (x0 - xi).abs() < 1e-7 {
                break;
            }
            x0 = xi;
        }

        return x0 as i32;
    }
}

go:

go 复制代码
func mySqrt(x int) int {
    if x == 0 {
		return 0
	}

	c, x0 := float64(x), float64(x)
	for {
		xi := 0.5 * (x0 + c/x0)
		if math.Abs(x0-xi) < 1e-7 {
			break
		}
		x0 = xi
	}

	return int(x0)
}

c++:

cpp 复制代码
class Solution {
public:
    int mySqrt(int x) {
        if (x == 0) {
            return 0;
        }

        double c = x, x0 = x;
        while (true) {
            double xi = 0.5 * (x0 + c / x0);
            if (fabs(x0 - xi) < 1e-7) {
                break;
            }
            x0 = xi;
        }

        return int(x0);
    }
};

python:

python 复制代码
class Solution:
    def mySqrt(self, x: int) -> int:
        if x == 0:
            return 0

        c, x0 = float(x), float(x)
        while True:
            xi = 0.5 * (x0 + c / x0)
            if abs(x0 - xi) < 1e-7:
                break
            x0 = xi

        return int(x0)

java:

java 复制代码
class Solution {
    public int mySqrt(int x) {
        if (x == 0) {
            return 0;
        }

        double c = x, x0 = x;
        while (true) {
            double xi = 0.5 * (x0 + c / x0);
            if (Math.abs(x0 - xi) < 1e-7) {
                break;
            }
            x0 = xi;
        }

        return (int) x0;
    }
}

非常感谢你阅读本文~

欢迎【点赞】【收藏】【评论】三连走一波~

放弃不难,但坚持一定很酷~

希望我们大家都能每天进步一点点~

本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


相关推荐
CodeSheep1 分钟前
同事偷偷给我介绍私活,说1万报酬全给我,结果甲方私下告诉我说,同事在当中白拿了2万,我觉得被耍了,媳妇却让我要知足,说我一点不亏
前端·后端·程序员
爱学习的小可爱卢1 分钟前
算法—Java Map 核心方法与实战场景指南
java·开发语言·算法
WWZZ20251 分钟前
Sim2Sim理论与实践3:深度强化学习
人工智能·算法·机器人·深度强化学习·具身智能·四足·人形
鱼人2 分钟前
iOS 与 Android 兼容性常见坑点排查指南
后端
七夜zippoe2 分钟前
DolphinDB脚本语言:从入门到精通
后端·struts·脚本·语言·dolphindb
会编程的土豆2 分钟前
【数据结构与算法】栈的应用
数据结构·c++·算法
IT_陈寒3 分钟前
SpringBoot这个"自动配置"差点让我加班到凌晨
前端·人工智能·后端
菜菜的顾清寒5 分钟前
力扣hot100(17) 缺失的第一个正数
算法·leetcode·职场和发展
小陈同学呦7 分钟前
从一个文件上传功能聊聊后端架构中的设计原则
后端
二月龙8 分钟前
小程序与H5的核心区别:沙箱环境、双线程架构
后端