博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Leetcode] Sqrt 开方
阅读量:7007 次
发布时间:2019-06-27

本文共 1088 字,大约阅读时间需要 3 分钟。

Sqrt

Implement int sqrt(int x).

Compute and return the square root of x.

二分搜索

复杂度

时间 O(1) 因为整数长度有限 空间 O(1)

思路

我们知道必定存在这么两个整数a和b,a^2 <= sqrt(x) <= b^2,所以我们要做的其实就是缩小这个ab的范围。使用二分法解这题时,通过比较mid^2和x大小来确定我们在哪一个半片中搜索。

注意

这题的边界条件较多,首先high要用long型存储,其次如果有必要的话要判断x是否是非负数。

代码

public class Solution {    public int mySqrt(int x) {        long low = 0 , high = x / 2;        while(low <= high){            int mid = low + (high - low) / 2;            if(mid * mid < x){                low = mid + 1;            } else {                high = mid - 1;            }        }        return (int)high;    }}

牛顿迭代法

复杂度

时间 O(1) 空间 O(1)

思路

更好的解法是用数学方法,牛顿法是非常经典的求解方程的方法。其基本公式是$$ x_{2}=x_{1}-\frac{x_{1}^2-n}{2x_{1}} $$,其中x1是上次计算结果,x2是本次计算结果,当他的误差小于一定值时返回。初始x值可选n/2,或者神奇数0x5f37642f。

代码

public class Solution {    public int sqrt(int x) {        // 如果初始值取0x5f37642f,则会进一步加快计算速度        double x1 = x/2.0;        double x2 = 0.0, err = x2 - x1;        while(Math.abs(err)>0.00000001){            x2 = x1 - (x1 * x1 - x) / (2 * x1);            err = x2 - x1;            x1 = x2;        }        return (int)x2;    }}

转载地址:http://axytl.baihongyu.com/

你可能感兴趣的文章
数组名和指针区别
查看>>
实现子数组和绝对值差最小 - Objective-C
查看>>
明天支付宝就开始提现收费了!这几招可以让你受用
查看>>
洛谷P4774 屠龙勇士
查看>>
mediascanner流程
查看>>
vue axios全攻略
查看>>
GZIP CSS JS
查看>>
HDU 3635 Dragon Balls
查看>>
基础DOM和CSS操作(三)
查看>>
HTTP 02 HTTP1.1 协议
查看>>
手机端网页web开发要点
查看>>
小弟浅谈asp.net页面生成周期---下
查看>>
正则表达式中 group groups区别
查看>>
JBoss + EJB3 + MySql : 开发第一个EJB
查看>>
浏览器请求阻塞到底是怎么回事?我们为什么要把静态资源分服务器放置?
查看>>
Oracle数据库基础知识
查看>>
2011年9月最新整理的10个有趣的jQuery插件集合
查看>>
Python的日志配置和处理
查看>>
小程序设置全屏显示
查看>>
c++ bind的简单使用 实例
查看>>