zoukankan      html  css  js  c++  java
  • 【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);
        }
    };
     
     
  • 相关阅读:
    Java页面中文编码要转换两次encodeURI
    ajax用get刷新页面元素在IE下无效解决~~
    祝贺自己开博~~
    错误域控降级导致解析问题
    ELK 脚本自动化删除索引
    Windows针对子目录共享权限控制
    ES查询区分大小写
    Docker异常时区问题
    Docker自定义镜像无容器日志输出
    ELK时间戳
  • 原文地址:https://www.cnblogs.com/wikiwen/p/10229483.html
Copyright © 2011-2022 走看看