40.Sqrt(x) (二分查找)
2015-10-23 20:41
162 查看
mplement
Compute and return the square root of x.
分析:
这道题目可以用二分查找的方法找 x 的平方根。
但是需要特别注意的是,当有两个int相乘的时候,要将其定义为long型,否则会造成溢出,使结果不准确。或者定义一个double型来先扩大其字节长度。
如果一定要定义成int型,那么在计算的时候要先计算除法,避免让两个int直接相乘。
int sqrt(int x).
Compute and return the square root of x.
分析:
这道题目可以用二分查找的方法找 x 的平方根。
public int mySqrt3(int x) { if(x<=1){ return x; } long low = 0; long high = x; long mid = 0;//这里用long long 是方便下面计算,如果用int会报错 while(low <= high){ mid = low+(high-low)/2; if(mid == x/mid){ return (int) mid; } if(mid * mid < x){//因为这里有 两个int相乘的情况,可能会溢出,所以要把mid定义成long的形式 low = mid +1; }else{ high = mid - 1; } } // 当找不到时候,这是low,high指针已经交叉,取较小的,即high return (int) high; }
但是需要特别注意的是,当有两个int相乘的时候,要将其定义为long型,否则会造成溢出,使结果不准确。或者定义一个double型来先扩大其字节长度。
public int mySqrt2(int x){ double diff = 0.01; // 误差 int low = 0; int high = x; while(low <= high){ // 注意越界!所以用double来存 double mid = low + (high-low)/2; if(Math.abs(mid*mid-x) <= diff){ return (int)mid; }else if(x > mid*mid+diff){ low = (int)mid+1; }else if(x < mid*mid-diff){ high = (int)mid-1; } } // 当找不到时候,这是low,high指针已经交叉,取较小的,即high return high; }
如果一定要定义成int型,那么在计算的时候要先计算除法,避免让两个int直接相乘。
public int mySqrt(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; } if(mid < x/mid){//当这个地方是mid*mid的时候提交就不通过。因为两个int相乘,很容易造成溢出 low = mid +1; }else{ high = mid - 1; } } // 当找不到时候,这是low,high指针已经交叉,取较小的,即high return high; }
相关文章推荐
- Jrebel实现Jetty 热部署
- javascript基础之七(函数闭包中this的变化)
- python opencv入门(读 / 写 显示以及转换图像 和 视频读入)
- mongoDB数据库的查询操作
- 用JS写的简单的猜数的游戏,一个是步数限制的,一个是有时间限制的。
- 深入沟通的重要性——《大道至简》第四章读后感
- 关于需要重新/额外打印的内容
- 《软件需求工程》 读书笔记之二
- C语言基础之Printf用法
- POJ 2386 Lake Counting DFS
- poj 1141 Brackets Sequence(区间DP记录路径)
- thinkphp——通过在线编辑器添加的内容在模板里正确显示(只显示内容,而不是html代码)
- Leetcode -- Merge k Sorted Lists
- 我前妻的故事(一个初中肄业生的奋斗)
- JAVA除去制定字符的方法
- POJ 2192 【DP】
- hdoj--2767--Proving Equivalences (scc+缩点)
- HDOJ 2112 HDU Today(最短路--dijkstra)
- 解决方法参数为arg0,arg1的问题
- 序列检测器改编