加载中…
个人资料
小虫不会飞_
小虫不会飞_
  • 博客等级:
  • 博客积分:0
  • 博客访问:0
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

LeetCode:Sqrt(x)

(2014-05-19 17:09:21)
标签:

sqrt

平方根

二分搜索

牛顿迭代

it

分类: 面试笔试

Implement int sqrt(int x).

Compute and return the square root of x.

咋看感觉很简单,求平方根嘛。用最简单的遍历搜索,貌似超出了时间。
然后考虑效率问题,考虑二分搜索:
1.二分搜索
class Solution {
public:
    int sqrt(int x) {
       int i = 0;
       int j = x/2 + 1;
       while(i <= j)
       {
            long mid = (i+j)/2; //这里用long long 是方便下面计算sq不用再转换,如果用int会报错
            long long sq = mid * mid;
            if(sq == x)
                return mid;
            else if(sq < x)
                i = mid + 1;
            else 
                j = mid - 1;            
       }
       return j;
    }
};

2. 牛顿迭代法

方法二:参考http://www.cnblogs.com/AnnieKim/archive/2013/04/18/3028607.html
http://images.cnitblog.com/blog/300640/201304/18155235-b272cc444a1845d3aede4c72a87f83dc.jpg

   为了方便理解,就先以本题为例:

   计算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 - (xi- n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2。

有了迭代公式,程序就好写了。关于牛顿迭代法,可以参考wikipedia以及百度百科


class Solution {
public:
    int sqrt(int x) {
        if(x == 0) return 0;
        double last = 0;
        double res = 1;
        while(last != res)
        {
            last = res;
            res = (last + x / last) / 2;
        }
        return res;
    }
};

实际面试遇到的题目可能不是对一个整数开方,而是对一个实数。方法和整数其实是一致的,只是结束条件换成左界和右界的差的绝对值小于某一个epsilon(极小值)即可。这里注意一个小问题,就是在java中我们可以用==来判断两个double是否相等,而在C++中我们则需要通过两个数的绝对值差小于某个极小值来判断两个double的相等性。实际上两个double因为精度问题往往是不可能每一位完全相等的,java中只是帮我们做了这种判定。
http://blog.csdn.net/linhuanmars/article/details/20089131

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有