2020年5月23日 星期六

LeetCode 69. Sqrt(x) [Easy] [C++] 解題筆記

這題給定一個整數 n 要我們求平方根。

EX:

       Input: 4
 
Ans: 2



想法:
        這裡我們可以反過來想,用 binary search 在 1~n 之間找平方最接近X的數。
另一種作法是利用數學方法,就是牛頓逼近法(Newton's method)來求解,因為求 n 的平方根等於求解 x^2 = n => f(x) = x^2 - n 等於0的解,因此透過牛頓法可以知道求解公式為:

xi+1=xi - (xi- n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2

牛頓法的詳細推導可以參考維基百科:



完整程式碼:

解法一 ( Binary Search ):

class Solution {
public:
    int mySqrt(int x) {
        if (x <= 1) { return x; }
        int left = 0;
        int right = x;
            
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (x / mid >= mid) {
                left = mid + 1;
            }   
            else {
                right = mid - 1;
            }   
        }   
            
        return left - 1;
    }   
};

解法二 (Newton's method):

class Solution {
public:
    int mySqrt(int x) {
        double ans = x;
        double delta = 0.00001;
        while (fabs(ans*ans - x) > delta) {
            ans = (ans + x / ans) / 2;
        }
        return ans;
    }
};

沒有留言:

張貼留言