leetcode69 X的平方根的几种解法
第一种自然就是调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的平方根的几种解法的更多相关文章
- [LeetCode] Remove Element (三种解法)
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- codewars.DNA题目几种解法分析(字符串替换)
题干: 意思就是字符串替换,"A"与"C"配对,"T"与"G"配对,DNA不为空. 解法一:我的解法,用for循环遍历字 ...
- LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)
这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...
- LeetCode算法题-Number Complement(Java实现-五种解法)
这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...
- leetcode-69.x的平方根
leetcode-69.x的平方根 Points 二分查找 牛顿迭代 题意 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保 ...
- LeetCode算法题-Third Maximum Number(Java实现-四种解法)
这是悦乐书的第222次更新,第235篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第89题(顺位题号是414).给定非空的整数数组,返回此数组中的第三个最大数字.如果不存 ...
- LeetCode算法题-Longest Palindrome(五种解法)
这是悦乐书的第220次更新,第232篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第87题(顺位题号是409).给定一个由小写或大写字母组成的字符串,找到可以用这些字母构 ...
- LeetCode算法题-Find the Difference(Java实现-五种解法)
这是悦乐书的第214次更新,第227篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第82题(顺位题号是389).给定两个字符串s和t,它们只包含小写字母.字符串t由随机混 ...
- LeetCode算法题-Valid Perfect Square(Java实现-四种解法)
这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...
随机推荐
- ES6 Template Strings(转)
转自:https://developers.google.com/web/updates/2015/01/ES6-Template-Strings Strings in JavaScript have ...
- 通俗易懂--SVM算法讲解(算法+案例)
1.SVM讲解 新闻分类案例 SVM是一个很复杂的算法,不是一篇博文就能够讲完的,所以此篇的定位是初学者能够接受的程度,并且讲的都是SVM的一种思想,通过此篇能够使读着会使用SVM就行,具体SVM的推 ...
- OO第5-7次作业总结
前三次作业可以说是入门编程,随着课程的深入,这三次多线程作业使我们开始慢慢接触工程性的编程任务. 对比起1-3次作业,5-7次作业明显没有那么顺利了,之前在互测环节每次最多就一个BUG或者没有BUG, ...
- jQuery的基本选择器
<script type="text/javascript"> //演示jQuery的基本选择器 $(function () { //通过ID var obj1 = $ ...
- 基于UML网络教学管理平台模型的搭建
一.基本信息 标题:基于UML网络教学管理平台模型的搭建 时间:2013 出版源:网络安全技术与应用 领域分类:UML:网络教学管理平台:模型 二.研究背景 问题定义:网络教学管理平台模型的搭建 难点 ...
- homekit2mqtt on DietPi
Followed official install instruction and got: dns_sd.DNSServiceRegister(self.serviceRef, flags, ifa ...
- EF学习笔记(九):异步处理和存储过程
总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 上一篇:EF学习笔记(八):更新关联数据 本篇原文:Async and Stored Procedures 为何要采用异步? ...
- Linux时间戳转换成BCD码(转载)
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> / ...
- 学习笔记----html的lang属性
lang属性的取值应该遵循 BCP 47 - Tags for Identifying Languages. 单一的 zh 和 zh-CN 均属于废弃用法. 问题主要在于,zh 现在不是语言code了 ...
- “PurMVC”在Unity中的应用
序章: 这是"游戏设计进阶技巧篇"内容,游戏中不使用如下技巧也可以正常运行,但是有了它以后可以增加项目的可读性,使功能”模块化“,”可视化“,”装逼化“(慢慢的恶意>,> ...