第一种自然就是调APi啦(手动滑稽)

public int mySqrt(int x) {
return (int)Math.sqrt(x);
}

时间是52 ms,还超过了1/5的人呢

第二种 二分法

就是在0--X之间一半地一半地砍,最后直到左右边界的中间的数 = X/mid,这样做是防止因为mid数字太大而导致溢出

看代码吧,跟排序类似

public int getSqrtByDevide(int x) {
if (x<=1) {
return x;
}
int low = 0;
int high = x;
int mid = 0;
while(low<=high) {
mid = low + (high - low)/2;
if(mid == (x/mid))
return mid;
else if(mid < (x/mid))
low = mid + 1;
else
high = high -1;
}
return high;
}

这种比上种稍微快一点:45 ms

第三种 牛顿迭代法

刚开始还没搞懂是怎么回事,后来看了网上的一些帖子才明白.

首先拿此题来说,假设最后的输出的结果x² = N,(N是函数参数终点x),这里可以看成一个函数,即f(x) = x² - N;

那么最终的目的就变成了求这个函数的零点了

迭代过程就是从X0开始,看它的平方是不是等于N,是就返回,不是就在X0对应的在函数图像上的点上做切线

再求这个切线和x轴的交点,重复上面的步骤:

f(x) = x² - N
设点Xi,则经过点(Xi,f(Xi))处的切线方程为g(x) = f(Xi)+ f'(Xi)(x - Xi)
令g(x) = 0
得x = Xi - f(Xi)/f'(Xi)
又f(Xi) = Xi² - N
代入得最终迭代式子:
x = (Xi + N/Xi)/2;

然后代码:

public int getSqrtByNewton(int x) {
if (x<=1) {
return x;
}
double last = -1;//最后
double ans = 1;//结果
while(last!=ans) {
last = ans;//将迭代前的ans存起来,如果和迭代后ans相等,代表非常逼近
ans = (ans+x/ans)/2;
}
return (int)ans; }

这个还是很快的:27ms

第四种 "0x5f3759df"算法

这个的原理我也没搞太清楚,好像有个专门的论文将这个算法的,很神奇,经常用于图形学游戏领域一些场景里面

那我就只贴个代码吧(凑个字数...)

public int mySqrt(int x) {
long t = x;
t = 0x5f3759df - (t >> 1);
while (!(t*t <= x && (t+1)*(t+1) > x))
t = (x/t + t)/2;
return (int)t;
}

这里有讲,挺麻烦的,我就知道打一波666吧...

http://www.sandaoge.com/info/new_id/30.html?author=1

leetcode69 X的平方根的几种解法的更多相关文章

  1. [LeetCode] Remove Element (三种解法)

    Given an array and a value, remove all instances of that value in place and return the new length. T ...

  2. codewars.DNA题目几种解法分析(字符串替换)

    题干: 意思就是字符串替换,"A"与"C"配对,"T"与"G"配对,DNA不为空. 解法一:我的解法,用for循环遍历字 ...

  3. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

  4. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  5. leetcode-69.x的平方根

    leetcode-69.x的平方根 Points 二分查找 牛顿迭代 题意 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保 ...

  6. LeetCode算法题-Third Maximum Number(Java实现-四种解法)

    这是悦乐书的第222次更新,第235篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第89题(顺位题号是414).给定非空的整数数组,返回此数组中的第三个最大数字.如果不存 ...

  7. LeetCode算法题-Longest Palindrome(五种解法)

    这是悦乐书的第220次更新,第232篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第87题(顺位题号是409).给定一个由小写或大写字母组成的字符串,找到可以用这些字母构 ...

  8. LeetCode算法题-Find the Difference(Java实现-五种解法)

    这是悦乐书的第214次更新,第227篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第82题(顺位题号是389).给定两个字符串s和t,它们只包含小写字母.字符串t由随机混 ...

  9. LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

    这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...

随机推荐

  1. java36

    1.Main public static void main(String [ ] args) public:被jvm调用的方法,权限要足够大 static:被jvm调用的方法,不需要创建对象,直接用 ...

  2. 【Selenium】【BugList5】chrom窗口未关闭,又新开窗口,报错:[8564:8632:0522/111825.341:ERROR:persistent_memory_allocator.cc(845)] Corruption detected in shared-memory segment.

    环境信息:Windows7 64位 + python 3.6.5 + selenium 3.11.0 +pyCharm 解决方法: 执行 driver = webdriver.Chrome()前必须把 ...

  3. H5新特性——--第三方绘图工具库 echarts(canvas)---SVG绘图

    今天学习的内容 3.1:h5新特性---第三方绘图工具库 echarts(canvas) 百度 echarts;d3;two.js;.... 3.2:h5新特性---SVG绘图 3.2:h5新特性-- ...

  4. Newtonsoft.Json 时间格式化

    时间序列化经常多个T:“2017-01-23T00:00:00” 解决方案: 日期格式化输出,指定IsoDateTimeConverter的DateTimeFormat即可 IsoDateTimeCo ...

  5. 【翻译】Flume 1.8.0 User Guide(用户指南) Sink

    翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...

  6. 第48章:MongoDB-备份和恢复

    ①文件系统快照(snapshot) 生成文件系统快照这个方法需要满足两个条件: 1:文件系统本身支持快照技术 2:运行mongod时必须开启日记系统 其恢复就是快照的恢复,当然,恢复的时候,确保mon ...

  7. [小结]InnoDB体系结构及工作原理

    参阅:<innodb存储引擎内幕>原创文章,会不定时更新,转发请标明出处:http://www.cnblogs.com/janehoo/p/7717041.html 一.概述: innod ...

  8. MySQL数据库(五)使用pymysql对数据库进行增删改查

    折腾好半天的数据库连接,由于之前未安装 pip ,而且自己用的python 版本为3.6. 只能用 pymysql 来连接数据库,(如果有和我一样未安装 pip 的朋友请 点这里http://blog ...

  9. Linux运行模式

    查看运行模式 cat /etc/inittab 0.表示关机模式,不要把默认模式设置成0 1.表示单用户模式 2.表示多用户模式 3.表示命令行模式 4.表示暂未被使用的模式,以后有可能会被使用 5. ...

  10. 当input中的type值为file时,各浏览器的表现形式不同

    如果想使各浏览器下的表现形式相同,需要对该input元素隐藏,然后再改元素下方添加标签.其html写法如下 <div class="input-file"> <i ...