[leetcode] sqrt(x)


Sqrt(x)

Implement int sqrt(int x).

Compute and return the square root of x.

惭愧,看了tag才知道需要用binary search。

二分查找,需要注意把x改为long long以免数据溢出。

另外,一个正数的平方根只能在[1, x / 2 + 1)之间变动。

class Solution {
public:
    int sqrt(int x) {
        if(x < 2) return x;
        return _sqrt(x, 1, x / 2 + 1);
    }
    //[start, end)
    int _sqrt(int x, int start, int end){
        if(end - start == 1){
            return start * start <= x? start: start - 1;
        }
        long long mid = (start + end) / 2;
        if(mid * mid > x){
            return _sqrt(x, start, mid);
        }
        else{
            return _sqrt(x, mid, end);
        }
    }
};

牛顿法

对于n找一个x使x^2 = n

记f(x) = x^2 – n,即求x使f(x) = 0

牛顿法找零点。

给定f(x)曲线上任意一点(x0,f(x0))作曲线在该点的切线。切线方程为:

(y-f(x0)) / (x – x0) = f'(x0)

f'(x0)=2×0

化简并令y=0,求x得

x=x0/2 + n / (2×0)

x即为x0的切线与x轴的交点。

再求(x,f(x))的切线与x轴的交点,不断迭代。

当两个相邻的x值相等时,认为结束。

下面的代码并没有AC。很奇怪,卡在了1上。

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

 

 

Untitled

Leave a comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.