Leecode题集——sqrtx
2016-08-07 11:14
162 查看
Implementint sqrt(int x).
Compute and return the square root of x.
直接遍历会超时,有两种方法:一是二分查找法,二是牛顿迭代法。
方法一、二分查找法
为了方便理解,就先以本题为例:
计算x2 = n的解,令f(x)=x2-n,相当于求解f(x)=0的解,如右图所示。
首先取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1。
同样的道理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2。
以此类推。
以这样的方式得到的xi会无限趋近于f(x)=0的解。
判断xi是否是f(x)=0的解有两种方法:
一是直接计算f(xi)的值判断是否为0,二是判断前后两个解xi和xi-1是否无限接近。
经过(xi, f(xi))这个点的切线方程为f(x) = f(xi) + f’(xi)(x - xi),其中f'(x)为f(x)的导数,本题中为2x。令切线方程等于0,即可求出xi+1=xi -
f(xi) / f'(xi)。
继续化简,xi+1=xi - (xi2 - n) / (2xi) = xi -
xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi +
n/xi) / 2。
int sqrt(int x)
{
if(x<0)
return -1;
if(x==0)
return 0;
double last=0;
double res=1;
while(last!=res)
{
last=res;
res=(res+x/res)/2;
}
return (int)res;
}当输入为double类型时,
double sqrt(double x)
{
if(x=0.0)
return 0.0;
double last=0.0;
double res=1.0;
while(last!=res)
{
last=res;
res=(res+x/res)/2;
}
return res;
}
Compute and return the square root of x.
直接遍历会超时,有两种方法:一是二分查找法,二是牛顿迭代法。
方法一、二分查找法
int sqrt(int x) { //鲁棒性检查,不合理输入 if(x<0) return -1; if(x==0) return 0; //确定搜索范围 long long i=0; long long j=x/2+1; while(i<=j) { long long mid=(i+j)/2; long long sq=mid*mid; if(sq<x) i=mid+1; else if(sq>x) j=mid-1; else return mid; } return j; }方法二、牛顿迭代法
为了方便理解,就先以本题为例:
计算x2 = n的解,令f(x)=x2-n,相当于求解f(x)=0的解,如右图所示。
首先取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1。
同样的道理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2。
以此类推。
以这样的方式得到的xi会无限趋近于f(x)=0的解。
判断xi是否是f(x)=0的解有两种方法:
一是直接计算f(xi)的值判断是否为0,二是判断前后两个解xi和xi-1是否无限接近。
经过(xi, f(xi))这个点的切线方程为f(x) = f(xi) + f’(xi)(x - xi),其中f'(x)为f(x)的导数,本题中为2x。令切线方程等于0,即可求出xi+1=xi -
f(xi) / f'(xi)。
继续化简,xi+1=xi - (xi2 - n) / (2xi) = xi -
xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi +
n/xi) / 2。
int sqrt(int x)
{
if(x<0)
return -1;
if(x==0)
return 0;
double last=0;
double res=1;
while(last!=res)
{
last=res;
res=(res+x/res)/2;
}
return (int)res;
}当输入为double类型时,
double sqrt(double x)
{
if(x=0.0)
return 0.0;
double last=0.0;
double res=1.0;
while(last!=res)
{
last=res;
res=(res+x/res)/2;
}
return res;
}
相关文章推荐
- Add Two Numbers_leetcode_#2
- Javascript 设置Cookie
- HDU5806 NanoApe Loves Sequence Ⅱ
- Java异常处理和设计
- mysql入门
- Git常用命令快速回顾(一)
- Struts2与Struts的区别
- LeetCode | Longest Substring Without Repeating Characters
- 信息安全工具集
- 我的第一篇博客
- CSUFT2016训练赛
- Golang elasticsearch 对接问题
- Android基于环信SDK开发IM即时聊天
- 洛谷1156 垃圾陷阱(背包动规)
- Java 异常处理的误区和经验总结
- 倒计时
- hdu 5804 Price List
- android am & pm常用的一下命令
- 【16.10更新】神器再现!百度云网盘批量高速下载 Chrome插件+IDM
- 【linux】epoll