【LeetCode & 剑指offer刷题】分治法题3:Sqrt(x)

【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

 Sqrt(x)

Implement int sqrt(int x).
Compute and return the square root of x, where x is guaranteed to be a non-negative integer.
Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.
Example 1:
Input: 4
Output: 2
Example 2:
Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since
the decimal part is truncated, 2 is returned.

C++
 
/*
本题其实与分治法无关
 
方法:变形的二分查找法,找最后一个不大于目标值(x/mid)的数(由于返回整数,故可以用此方法)
*/
class Solution
{
public:
    int mySqrt(int x)
    {
        if (x <= 1) return x;
        int left = 0, right = x;
        while (left < right)
        {
            int mid = left + (right - left) / 2;
            if (mid <= (x/mid) )
                left = mid + 1;
            else
                right = mid;
        }
        return right - 1; //通过返回right-1,改造返回第一个大于目标值(x/mid)的数 -> 返回最后一个不大于目标值的数
    }
};
 
/*
方法二:牛顿迭代法
对于求方程f(x) = 0的根,可用迭代式 xk+1 = xk - f(xk)/f'(xk)进行求解
(特殊的简单迭代法xk+1 = p(xk),x = p(x)等价于f(x) = 0
 
对此例x^2 = n,可推得xk+1 = (xk + n/xk)/2
*/
class Solution
{
public:
    int mySqrt(int n)
    {
        if (n <= 1) return n;
        
        double x = 1, x_pre = 0;
        while (abs(x - x_pre) > 1e-6) //精度具体依题目要求
        {
            x_pre = x;
            x = (x + n / x) / 2;
        }
        return int(x);
    }
};
 
 

 

posted @ 2019-01-06 17:18  wikiwen  阅读(263)  评论(0编辑  收藏  举报