本期精选题解由我们的用户“liweiwei1419”倾情撰写,一起来看看吧!

力扣 69. X 的平方根(点击查看题目)

题目描述

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

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

示例 1:

示例 2:

解决方案

二分查找法应用于搜索平方根的思想很简单,其实就是“猜”,但是是有策略的“猜”,用“排除法”在有限的区间里,一次排除一半的区间元素,最后只剩下一个数,这个数就是题目要求的向下取整的平方根整数。

牛顿法最初提出的时候,是用于求解方程的根,它的基本思想是“以直代曲”,在迭代中搜索得到方程的近似解。

方法一:二分法

思路分析:使用二分法搜索平方根的思想很简单,就类似于小时候我们看的电视节目中的“猜价格”游戏,高了就往低了猜,低了就往高了猜,范围越来越小。因此,使用二分法猜算术平方根就很自然。

一个数的平方根肯定不会超过它自己,不过直觉还告诉我们,一个数的平方根最多不会超过它的一半,例如 8 的平方根,8 的一半是 4,4^2 = 16 > 8,如果这个数越大越是如此,因此我们要计算一下,这个边界是多少。为此,解如下不等式:

意即:如果一个数的一半的平方大于它自己,那么这个数的取值范围。解以上不等式得 a ≥ 4 或者 a ≤ 0。

于是边界值就是 4,那么对0、1、2、3 分别计算结果,很容易知道,这 4 个数的平方根依次是 0、1、1、1 。

注意:这 4 个特值如果没有考虑到,有可能导致你设置的搜索边界不正确。在使用二分法寻找平方根的时候,要特别注意边界值的选择,以下给出两个参考代码。

参考代码 1:所有的数都放在一起考虑,为了照顾到 0 把左边界设置为 0,为了照顾到 1 把右边界设置为 x // 2 + 1 。

Python 实现

Java 实现

Java 代码要注意到:如果中点 mid 声明为 int 类型,针对大整型测试用例通不过,因此变量需要声明为 long 类型,下同。

参考代码 2:事实上,只要单独照顾一下 0 这个特例就可以了。

​Python 实现

Java 实现

注意: 这里二分法的使用是有技巧的(如果你没有意识到,这里很可能是个“坑”),下面我就上面注释中提到的:

注意:这里一定取右中位数,如果取左中位数,代码可能会进入死循环。

做一些解释。当 x = 9 的时候,我们不妨给“错误的”代码加上一些调试语句,这样你就会更清晰地发现死循环在什么时候出现,例如:

Python 实现

控制台输出

分析:如果取中点为左中位数,你看到死循环发生在 left = 3, right = 4 的时候,此时 区间只有 2 个元素。这是为什么呢?

此时索引区间 [3, 4] 的中位数为左中位数,即 mid = 3 ,此时 square = 9 < 9 不成立,进入 left = mid 这个分支,你发现问题了吗,区间不发生收缩,即下一轮循环的索引区间还是 [3, 4],此时中位数还取左中位数,即mid = 3 ,square = 9 < 9 不成立,又进入 left = mid 这个分支,死循环就是这样产生的。

接着,请你把 mid = left + (right - left) // 2 改成mid = left + (right - left + 1) // 2 ,即选择右中位数,再观察一下控制台输出,就知道此时为什么要选右中位数了。

这个二分法模板我用了很久,感觉非常好用。于是我专门把这个二分法模板好用的地方、使用它的技巧和注意事项整理在了「力扣 」第 35 题:搜索插入位置的题解 《特别好用的二分查找法模板(Python 代码、Java 代码)》,希望能对大家有所帮助。

复杂度分析

时间复杂度:O(log N),二分法的时间复杂度是对数级别的。

空间复杂度:O(1),使用了常数个数的辅助空间用于存储和比较。

总结: 使用二分查找法搜索,注意特值对搜索边界的影响。

以下这部分内容是根据与用户 @lukas 在本题解下的讨论而添加的。

在这里补充一下,如果你实在不太想分析 a 的平方根可能的上界,之前说了,它肯定不会超过 a 自己,即使你把上界写成一个很大的数,例如 999999,这个数必须得是力扣的测试用例都达不到的数,在二分查找的过程中,不符合要求的数每次会被很快砍掉一半。

参考代码 3:干脆我不讨论 a 的边界,让二分法去排除不符合的区间吧,对数级别的时间复杂度对性能不会有很大影响。

Python 实现

Java 实现

方法二:牛顿法

使用牛顿法可以得到一个正实数的算术平方根,因为题目中说“结果只保留整数部分”,因此,我们把使用牛顿法得到的浮点数转换为整数即可。

这里给出牛顿法的思想:

在迭代过程中,以 直线代替曲线,用一阶泰勒展式(即在当前点的切线)代替原曲线,求直线与 X 轴的交点,重复这个过程直到收敛。

说明:

1、以上图片来自《牛顿法与拟牛顿法》;

2、@LOAFER 的题解《牛顿迭代法》 的图和文字说明更好,而知乎问答《如何通俗易懂地讲解牛顿迭代法求开方?数值分析?》里面干货就更多了,建议大家出门左转观看,我这篇题解只是展示一下迭代公式如何计算。

注意:牛顿法得到的是平方根的浮点型精确值(可能会有一定误差),根据题目中的要求,把最后得到的这个数转换为 int 型,即去掉小数部分即可。

对“牛顿法”感兴趣的朋友们可以查一下牛顿法的应用:一个是求方程的根,另一个是求解最优化问题,在这里就不展开了。

参考代码 4

Python 实现

Java 实现

说明:1e-6 是科学计数法,表示 1 乘以 10 的负 6 次方,也就是 0.000001。有的地方使用 epsilon 表示 1e-6 ,用来抵消浮点运算中因为误差造成的相等无法判断的情况,它通常是一个非常小的数字,具体多小要根据你的精度需求来设置。

​复杂度分析

时间复杂度:(待讨论)

空间复杂度:O(1),使用了常数个数的辅助空间用于存储和比较。

本文作者:liweiwei1419

声明:本文归作者版权所有,如需转载请联系。

求一个任意实数c的算术平方根_LeetCode 题解 | 69. X 的平方根相关推荐

  1. 求一个任意实数c的算术平方根g_中考总复习实数知识点

    [考纲要求] 1.了解有理数.无理数.实数的概念:借助数轴理解相反数.绝对值的概念及意义,会比较实数的大小: 2.知道实数与数轴上的点一一对应,会用科学记数法表示有理数,会求近似数和有效数字:了解乘方 ...

  2. 求一个任意实数c的算术平方根g_初中数学实数相关知识点:这些小技巧,解题有大用...

    实数在初中数学阶段算是一个大的版块,其中包括了很多的知识点,其中有一些简单的,也有一些较难的知识点,而在利用这些知识点解题的时候有时可能要转个弯,才能解的更快,而一般来说,实数的相关题目都是单选和填空 ...

  3. 求一个任意实数c的算术平方根g的算法设计思想_算法复习第四篇——贪心法

    公元2020年5月5日,距离算法考试仅剩4天. 一.知识归纳 1.设计思想 只根据当前已有的信息就做出选择,而且一旦做出了选择,将来无论如何都不能更改 不从整体最优考虑,所做的选择只是在某种意义上的局 ...

  4. 用计算机算算术平方根顺序是ON然后是什么,第2课时用计算器求一个正数的算术平方根.ppt...

    1.比较下列各组数的大小: (1) 与 (2) 与 8 依次按键 显示:1.732 050 808 例3 小丽想用一块面积为400 cm2的正方形纸片,沿着边的方向剪出一块面积为300 cm2的长方形 ...

  5. python函数实现求非负实数平方根,在shell里调用

    编写python函数实现求非负实数平方根,在shell里调用 算法 牛顿迭代法 描述如下 函数代码 调用函数 算法 牛顿迭代法 利用切线逼近曲线,求曲线零点,对于曲线 y=f(x)y = f(x)y= ...

  6. 用计算机求正有理数算术平方根的步骤,用计算器求算数平方根、用有理数估计算数平方根的大小.ppt...

    用计算器求算数平方根.用有理数估计算数平方根的大小.ppt 上传人:jw****88 文档编号:85573818 上传时间:2020-06-11 格式:PPT 页数:20 大小:2.14MB 下载提示 ...

  7. python求解立方根,python环境下使用牛顿迭代法求任意实数立方根

    https://images1.tqwba.com/20200918/xx0b50i53j4 推导过程如下: 一般牛顿迭代法的图名都叫做Newton-Raphson.也就是牛顿-拉弗森法 二.使用牛顿 ...

  8. 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达式的值

    栈的设计与使用 实验内容 设计一个算法,将一般算术表达式转化为逆波兰表达式,并求逆波兰表达的值 解题思路 (1)一般算术表达(中缀表达),如#3×(4+2)/2-5#,#为表达式界定符,逆波兰表达式( ...

  9. C语言输入一个任意数求各位数的和

    C语言输入一个任意数求各位数的和 int main(void) {int x, r, s = 0;scanf("%d", &x);while (x>0){r = x ...

最新文章

  1. MySQL 8.0 Invisible Indexes 和 RDS 5.6 Invisible Indexes介绍
  2. 豪取4个SOTA,谷歌魔改Transformer登NeurIPS 2021!一层8个token比1024个还好用
  3. Hey!你的 CSDN 年度报告已出炉,请查收~
  4. poj 1379 模拟退火法
  5. 全球及中国教育信息化行业投资模式与发展建议咨询报告2022版
  6. 快速看完整部教材,列出你不懂的 5 - 10 个问题
  7. solidity struct 结构体创建与使用浅学 (四)
  8. 英语中十二个月名称的由来
  9. 计算机故障检修课过时,第三场公开课|电脑故障维修以及笔记本知识科普
  10. php中图片怎么加样式,html5实现各种图片样式实例用法汇总
  11. 机器学习之欠拟合与过拟合
  12. docker容器内没有yum命令_为什么不建议把数据库部署在Docker容器内?
  13. sql 存储过程 并发测试_SQL单元测试模拟存储过程
  14. 五子棋java百度贴吧_五子棋单机版
  15. “寓教于乐”,DeepMind新研究让机器人从0开始学习复杂精细动作
  16. 体操冠军江钰源:妈妈你不要去讨饭了
  17. android模拟器 vt,逍遥安卓模拟器VT模式如何设置?VT模式设置流程图文分享
  18. Google设置应用专用密码
  19. Rabbitmq关于guest用户登录失败解决方法
  20. HTC Desire获取ROOT方法--HTC Desire rooting guide (now with new improved / easier root method!)

热门文章

  1. PyQt5随笔:QTextEdit、QTextBrowser添加的文字超出视图后,滑动条自动移至最底部,显示最新文本解决
  2. 如何访问kubelet API接口
  3. 使用Arc Map创建渔网(fishnet)
  4. python3 moka_[北京] Moka 求大牛~Node 后端工程师看过来(Python, Ruby, Go 等小伙伴也别错过)...
  5. linux服务器客户端计算器,分享|两款 Linux 桌面端可用的科学计算器
  6. 2017HW软件精英挑战赛总结
  7. 题解 P3353 【在你窗外闪耀的星星】
  8. 2021-07-20accelerated c++第2章
  9. 门诊计算机管理制度,诊所信息系统管理制度
  10. python定义一个列表存放52张扑克牌_Python 制作一副扑克牌,有趣的案例!