首页 > 其他 > 详细

Sqrt(x) -- LeetCode

时间:2014-02-28 22:38:34      阅读:559      评论:0      收藏:0      [点我收藏+]
原题链接: http://oj.leetcode.com/problems/sqrtx/ 

这是一道数值处理的题目,和Divide Two Integers不同,这道题一般采用数值中经常用的另一种方法:二分法。基本思路是跟二分查找类似,要求是知道结果的范围,取定左界和右界,然后每次砍掉不满足条件的一半,知道左界和右界相遇。算法的时间复杂度是O(logx),空间复杂度是O(1)。代码如下:

public int sqrt(int x) {
    if(x<0) return -1;
    if(x==0) return 0;
    int l=1;
    int r=x/2+1;
    while(l<=r)
    {
        int m = (l+r)/2;
        if(m<=x/m && x/(m+1)<m+1)
            return m;
        if(x/m<m)
        {
            r = m-1;
        }
        else
        {
            l = m+1;
        }
    }
    return 0;
}
这种方法在数值计算中非常常见,还是得熟练掌握。实际面试遇到的题目可能不是对一个整数开方,而是对一个实数。方法和整数其实是一致的,只是结束条件换成左界和右界的差的绝对值小于某一个epsilon(极小值)即可。这里注意一个小问题,就是在java中我们可以用==来判断两个double是否相等,而在C++中我们则需要通过两个数的绝对值差小于某个极小值来判断两个double的相等性。实际上两个double因为精度问题往往是不可能每一位完全相等的,java中只是帮我们做了这种判定。
比较典型的数值处理的题目还有Divide Two IntegersPow(x,n)等,其实方法差不多,一般就是用二分法或者以2为基进行位处理的方法。

Sqrt(x) -- LeetCode,布布扣,bubuko.com

Sqrt(x) -- LeetCode

原文:http://blog.csdn.net/linhuanmars/article/details/20089131

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!