求根号x(LeetCode--分治篇)

题目描述

实现int sqrt(int x).计算并返回x的平方根。

方法

牛顿迭代法和二分查找法

1. 牛顿迭代法

思路:给定一个初始值,然后通过迭代来逼近方程的解

举例:本题求的是函数f(x) = x^2 - t = 0(其中t为所给数值x)的解

  • 赋初始值,假设x0 = t
  • 计算迭代公式,在点(x0,f(x0))处对曲线作切线,得到如下方程y - f(x0) = f(x0)'(x - x0),
  • 令y = 0,解得x = x0/2 + t/(2x0),则迭代的解x1 = x0/2 + t/(2x0),继续依次迭代
  • 直到f(xn)很接近于0(与0的差绝对值小于某一阈值),迭代终止,xn即为函数的解

代码示例:

class Solution {
public:
    int sqrt(int x) {
        if (x ==0 || x == 1) {
            return x;
        }
        double temp = x;
        while (fabs(temp*temp - x) > 0.0001) {
            temp = (temp + x/temp)/2;
        }
        return int(temp);
    }

};

2.二分查找法

思路:将1到x区间一分为二,从中间mid = (1+x)/2开始找起,若mid>x/mid,向左移动,若mid==x/mid,返回mid,若mid

代码示例:

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

你可能感兴趣的:(LeetCode刷题笔记)