【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 );
    }
};
 
 

猜你喜欢

转载自www.cnblogs.com/wikiwen/p/10229483.html
今日推荐