题目:
Implement int sqrt(int x)
.
Compute and return the square root of x.
思路:我的天呀,一开始拿到这个题目完全没有感想呀,完全不知道啊,做尼玛嗨啊,第一天刷第一题就不会啊,还要把所有题目都刷干净啊,我勒个深深的草啊。
网上资料:
牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中
说白了,就是以下公式:
求n的平方根,先假设一猜测值
先让我们来验证下这个巧妙的方法准确性,来算下2的平方根 (Computed by Mathomatic) 1-> x_new = ( x_old + y/x_old )/2 y (x_old + -----) x_old #1: x_new = --------------- 2 1-> calculate x_old 1 Enter y: 2 Enter initial x_old: 1 x_new = 1.5 1-> calculate x_old 2 Enter y: 2 Enter initial x_old: 1 x_new = 1.4166666666667 1-> calculate x_old 3 Enter y: 2 Enter initial x_old: 1 x_new = 1.4142156862745 1-> calculate x_old 10 Enter y: 2 Enter initial x_old: 1 Convergence reached after 6 iterations. x_new = 1.4142135623731 ... 可见,随着迭代次数的增加,运算值会愈发接近真实值。 于是可以得到代码段:
PS:后来在leetcode上提交后发现用了6ms只击败了百分之10.13的其他用户,一怒之下一同分析删掉ABS函数,仍然没变化,等周末有空好好的研究下推导,再次刷到这个题的时候再考虑更好的方法
接下来是相关的数理推导:
引申 从推导来看,其实牛顿迭代法不仅可以用来求平方根,还可以求立方根,甚至更复杂的运算。 |