69. Sqrt(x)
题目:
Implement int sqrt(int x).
Compute and return the square root of x.
链接: http://leetcode.com/problems/sqrtx/
题解:
求平方根。
二分法, Time Complexity - O(logn), Space Complexity - O(1)
public class Solution {
public int mySqrt(int x) {
if(x <= 1)
return x;
int lo = 0, hi = x;
while(lo <= hi) {
int mid = lo + (hi - lo) / 2;
if(mid < x / mid)
lo = mid + 1;
else if (mid > x / mid)
hi = mid - 1;
else
return mid;
}
return hi;
}
}
牛顿法
public class Solution {
public int sqrt(int x) {
if (x == 0) return 0;
double lastY = 0;
double y = 1;
while (y != lastY) {
lastY = y;
y = (y + x / y) / 2;
}
return (int)(y);
}
}
Bit Manipulation
public class Solution {
public int mySqrt(int x) {
long ans = 0;
long bit = 1l << 16;
while(bit > 0) {
ans |= bit;
if (ans * ans > x) {
ans ^= bit;
}
bit >>= 1;
}
return (int)ans;
}
}
Follow up - 求实数的平方根。 设置一个ε,然后根据差值计算
二刷:
可以用二分法或者牛顿法。
Java:
二分法:
二分法写得比较古怪,有点像背出来的, 为了避免Integer.MAX_VALUE用了 x / mid。mid不会为0,所以可以放心大胆使用。 最后返回结果时要返回的是hi, 这是 lo ^2会正好比x大。
Time Complexity - O(logn), Space Complexity - O(1)
public class Solution {
public int mySqrt(int x) {
if (x <= 1) {
return x;
}
int lo = 0, hi = x;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (mid == x / mid) {
return mid;
} else if (mid < x / mid) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
return hi;
}
}
牛顿法:
牛顿法也可以用来处理double的情况,只要把条件改为y - lastY > epsilon就可以了。一开始设x2 = a,则转化为方程y = x2 - a, 接下来右xn+1 = xn - f(x) / f'(x)。 新的y (切线逼近)等于 xn+1 = xn - ( x2- a ) / (y的导数 = 2x),所以简化一下就等于xn+1 = (xn + a / xn) / 2,用切线进行不断逼近。
Time Complexity - O(logn), Space Complexity - O(1)
public class Solution {
public int mySqrt(int x) {
if (x <= 1) {
return x;
}
double lastY = x / 2;
double y = (lastY + x / lastY) / 2;
while (y - lastY != 0) {
lastY = y;
y = (lastY + x / lastY) / 2;
}
return (int)y;
}
}
三刷:
Java:
二分法:
public class Solution {
public int mySqrt(int x) {
if (x <= 1) return x;
int lo = 0, hi = x;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
if (mid == x / mid) return mid;
else if (mid < x / mid) lo = mid + 1;
else hi = mid - 1;
}
return hi;
}
}
牛顿法:
再次详述一下牛顿法。
牛顿法主要是使用切线来不断逼近方程根的方法。
- 首先我们有x2 = a,移动一下我们得到方程x2 - a = 0。
- 我们假设函数 f(x) = x2 - a, 则这个方程的切线 f'(x) = 2x,也就是切线的斜率为2
- 利用直线的两点式方程我们可以得到 xn+1 - xn = ( 0 - f(xn) ) / f'(xn), 这里新的逼近点为(xn+1 , 0),即切线与x轴的焦点, 旧的逼近点为(xn , f(xn ))。
- 这里我们做一下变量代换, f'(x) = 2x, f(x) = x2 - a
- 我们可以得到 xn+1 - xn = (a - xn2) / 2 * xn , 简化一下就变成了 xn+1 = (xn + a / xn) / 2
- 在 xn+1 - xn 的差大于一个误差常数Epsilon的时候,我们就可以用while循环来不断使用切线迭代逼近方程x2 - a = 0的根, 最后就可以成功求得一个在Epsilon误差内的,方程的解。
public class Solution {
public int mySqrt(int x) {
if (x <= 1) {
return x;
}
double lastY = 1;
double y = (lastY + x / lastY) / 2;
while (y - lastY != 0) {
lastY = y;
y = (lastY + x / lastY) / 2;
}
return (int)y;
}
}
4/4/2016: 从wentao处又学习了很多东西。他是数学PHD大牛,推理和论证功力简直一级棒。
Reference:
http://www.matrix67.com/blog/archives/361
https://en.wiki2.org/wiki/Methods_of_computing_square_roots
http://www.math.harvard.edu/library/sternberg/slides/lec1.pdf
http://www.cnblogs.com/bigrabbit/archive/2012/09/25/2702174.html
69. Sqrt(x)的更多相关文章
- C++版 - Leetcode 69. Sqrt(x) 解题报告【C库函数sqrt(x)模拟-求平方根】
69. Sqrt(x) Total Accepted: 93296 Total Submissions: 368340 Difficulty: Medium 提交网址: https://leetcod ...
- Leetcode 69. Sqrt(x)及其扩展(有/无精度、二分法、牛顿法)详解
Leetcode 69. Sqrt(x) Easy https://leetcode.com/problems/sqrtx/ Implement int sqrt(int x). Compute an ...
- 69. Sqrt(x) - LeetCode
Question 69. Sqrt(x) Solution 题目大意: 求一个数的平方根 思路: 二分查找 Python实现: def sqrt(x): l = 0 r = x + 1 while l ...
- [LeetCode] 69. Sqrt(x) 求平方根
Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a no ...
- Leetcode 69. Sqrt(x)
Implement int sqrt(int x). 思路: Binary Search class Solution(object): def mySqrt(self, x): "&quo ...
- 【一天一道LeetCode】#69. Sqrt(x)
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Impleme ...
- (二分查找 拓展) leetcode 69. Sqrt(x)
Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a no ...
- [LeetCode] 69. Sqrt(x)_Easy tag: Binary Search
Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a no ...
- 69. Sqrt(x)(二分查找)
Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a no ...
随机推荐
- Microsoft .NET Framework 3.5 for Windowns Server2012R2 GUI
图形化安装,需要安装盘,不需要网络连接
- Oracle 主键
给student 表产生 自增的序列主键 increment ; ----IBATIS简单入门教程http://www.cnblogs.com/ycxyyzw/archive/2012/10/13/2 ...
- Linux 挂载2T以上存储
在生产环境中,我们会遇到分区大于2T的磁盘(比如:添加一个3TB的存储),由于MBR分区表只支持2T磁盘,所以大于2T的磁盘必须使用GPT分区表 而fdisk是不支持GPT分区的,我们可以使用part ...
- mysql 配置主从
1.选择2个ip,1个为主,1个为从:例:主:192.168.12.76 从:192.168.12.772.在192.168.12.76的my.cnf 配置master,添加如下:(红色为添加的内容) ...
- return *this和return this的区别
别跟我说, return *this返回当前对象, return this返回当前对象的地址(指向当前对象的指针). 正确答案为:return *this返回的是当前对象的克隆(当然, 这里仅考虑返回 ...
- [转]unable to resolve superclass of 的奇怪问题和一种解决方法!
[转]unable to resolve superclass of 的奇怪问题和一种解决方法! http://blog.csdn.net/jackymvc/article/details/90015 ...
- ASP.NET MVC +EasyUI 权限设计(一)开篇
在前一段时间中,老魏的确非常的忙碌,Blog基本上没有更新了,非常的抱歉,那么在后面的时间中,老魏会尽量的抽时间来写的,可能时间上就不太富裕了.今天开始呢,老魏会和大家分享一下关于权限设计的有关文章, ...
- 实现iOS长时间后台的两种方法:Audiosession和VOIP(转)
分类: Iphone2013-01-24 14:03 986人阅读 评论(0) 收藏 举报 我们知道iOS开启后台任务后可以获得最多600秒的执行时间,而一些需要在后台下载或者与服务器保持连接的App ...
- JDBC增删改查
/* db.properties的配置 driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/day14 username=root ...
- NodeJS -Express 4.0 用include取代partial
在Express 4.0 下按如下方法设置: (1)运行cmd 输入:npm install express-partials -g (2)下载成功后.在app.js 中引用此插件 var par ...