Sqrt(x)

没错,有几天没写LeetCode了,就遇上了sqrt函数的编写,这是不是很简单呢?于是我很快的想出了遍历的方法,但是马上又想到了若是一个最大的整数位测试用例呢?那么效率太低了吧,于是我以效率为出发点又想到了二分法,使用二分法自己测试了几个,感觉还可以,于是就提交了,代码如下:

class Solution
{
public:int mySqrt(int x){//二分法assert(x >= 0);//1.特殊情况if (x == 0 || x == 1){return x;}//2.一般情况int left = 0;int right = x;int mid = (left + right) / 2;while (mid*mid > x || (mid+1)*(mid+1) <= x){if (mid * mid > x){right = mid;}else if ( (mid + 1) * (mid + 1) <= x){left = mid;}mid = (left + right) / 2;}return mid;}
};

测试用例卡在了2147395599上面,结果如下:

出现这种结果说明二分法还是不够优化,那么我们所能想到的办法还有什么呢?我感觉真的是想不出来,于是我在网上看了一些文章,将关于sqrt函数的问题,于是我找到了一种求解方法,利用到的思想是”牛顿迭代法快速寻找平方根“,其思想是利用高数中的思想:求 X^2 - a = 0 的根,这些思想若是没有学习过真的是想不出来的,我是参考一篇文章,所以最后我会将这篇文章贴出来,分享给大家。

使用牛顿迭代快速寻找平方根的思想,我们可以写出下列代码:

class Solution
{
public:int mySqrt(int x){//牛顿迭代法assert(x >= 0);if (x == 0 || x == 1){return x;}float val = x;   //最终float last;        //保存上一个计算的值do{last = val;val = (val + x / val) / 2;} while (abs(val - last) > 0.01); //因为这个题的最终结果是整数,所以我们可以将精度提高点int ret = (int)val;if (ret*ret > x){return ret - 1;}else{return ret;}}
};

这个函数最终被接收了,结果如下:

其实到这里还没完呢?有些人真的是大神,他们只要两步就可以求出一个数的平方根,他的思路我还没弄明白,因为源码是某游戏引擎的代码,不过这里还是将他的代码贴出来,跟大家分享一下:

class Solution
{
public:int mySqrt(int x){//数学大神根据牛顿迭代法来求推导出的神奇方法assert(x >= 0);if (x == 0 || x == 1){return x;}float tmp = x;float xhalf = 0.5f*tmp;int i = *(int*)&tmp;i = 0x5f375a86 - (i >> 1); // 这一步是关键tmp = *(float*)&i;tmp = tmp*(1.5f - xhalf*tmp*tmp);tmp = tmp*(1.5f - xhalf*tmp*tmp);tmp = tmp*(1.5f - xhalf*tmp*tmp);int ret = 1 / tmp;if (ret*ret > x){return ret - 1;}return ret;}
};

这种方法是正确的,因为它是游戏引擎中的源码,所以不用验证都可以知道其正确性。

我个人觉得这种类型的题真的是很吃数学功底,也道题很彻底的让我感受到了数学的强大,让我深受感触。下面我就给出我看过的文章的出处:参考文章

LeetCode 69相关推荐

  1. 【分治】LeetCode 69. Sqrt(x)

    LeetCode 69. Sqrt(x) 参考网址:http://www.cnblogs.com/grandyang/p/4346413.html Solution1: class Solution ...

  2. LeetCode #69 x的平方根 二分查找

    LeetCode #69 x的平方根 题目描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍 ...

  3. LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根

    LeetCode 69. x 的平方根:二分查找法实现自定义的函数:x 的平方根 题目描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型 ...

  4. LeetCode - 69. x 的平方根

    69. x 的平方根 class Solution {private static final Integer MAX_POW = 46340;/*** 牛顿迭代* f(x) = x^2 - n* 切 ...

  5. LeetCode 69. x 的平方根(二分查找)

    文章目录 1. 题目 2.解题 2.1 二分查找 2.2 牛顿迭代 1. 题目 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果 ...

  6. 1.1.3 数组——x的平方(Leetcode 69)

    x的平方 1. 题目 2. 思路 3. 代码实现 4. 总结 1. 题目 leetcode链接 给你一个非负整数 x ,计算并返回 x 的 算术平方根 . 由于返回类型是整数,结果只保留 整数部分 , ...

  7. 【手绘漫画】图解LeetCode之x 的平方根(LeetCode 69题)

    文章目录 图解LeetCode刷题计划 1.写在前面 2.题目 3.正文 4.代码 图解LeetCode刷题计划 1.写在前面 手绘漫画系列正式上线!!!"图解LeetCode刷题计划&qu ...

  8. LeetCode——69 x的平方根

    问题描述: 实现 int sqrt(int x) 函数.计算并返回 x 的平方根,其中 x 是非负整数.由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 ...

  9. LeetCode:69. Sqrt(x)

    题目链接: 69. Sqrt(x) 题目描述: Implement int sqrt(int x) Compute and return the square root of x. 题目解释: 提干非 ...

最新文章

  1. SAP QM初阶执行事务代码QDB1,报错- Sampling procedure NM000001 has no sampling scheme-
  2. 图神经网络可以解决现实世界中的问题吗?
  3. WebAssembly 系列(一):生动形象地介绍 WebAssembly
  4. boost::hana::greater_equal用法的测试程序
  5. 闭环检测python_hdl_graph_slam源码解读(七):闭环检测
  6. 使用C#调试Windows服务模板项目
  7. 如何在C#中从同步方法调用异步方法?
  8. 封装kmalloc/malloc的一些小函数
  9. 明解C语言第三章习题
  10. 从 IPv4 向 IPv6 的迁移
  11. 电脑PC端如何下载B站视频?
  12. python 修改照片分辨率
  13. 有哪些因素会淘宝的宝贝突然没有流量?
  14. 使OEM分区变成可格式化
  15. 百度地图 ( 一 ) 显示地图
  16. Objective-C 理解之方括号[ ]的使用
  17. mysql dump 1449_mysqldump: Got error: 1449
  18. TP+UC+DZ同步登陆问题汇总
  19. python 英语词典_使用Python的英语词典应用程序
  20. 四个技巧提升你的网站百度收录量

热门文章

  1. Python创始人为什么叫“龟叔”?
  2. python搜题题库_中国大学慕课2020用Python玩转数据答案搜题公众号
  3. border 0.5 IOS兼容问题
  4. C# 处理PGM、Pcx、Pnm、Ras、Sgi、Tga、Xpm 等图片,读取与显示
  5. oracle j000 deied,一个Job运行失败导致数据库挂死
  6. Finablr将加快客户导向型技术创新
  7. 产品经理必备数据统计网站汇总
  8. 爱奇艺 android下载视频无法播放器,爱奇艺怎么看不了 视频无法播放怎么回事
  9. FreeSurfer汉化教程
  10. 台式计算机用电量是多少,电脑一天耗电量是多少(含台式机和笔记本)?