Crack LeetCode 之 69. Sqrt(x)

https://leetcode.com/problems/sqrtx/

本题可以采用二分法和牛顿法,以下分别为C++和python实现。

struct Solution {
	int sqrt(int x) {
		if (x == 0)
			return 0;

		double lastY = 0;
		double y = 1;
		while (y != lastY) {
			lastY = y;
			y = (y + x / y) / 2;
		}

		return (int)(y);
	}
};
class Solution:
    def mySqrt(self, x):
        if x == 0:
            return 0

        l = 1
        r = int(x/2)
        
        while l <= r:
            m = (int)((l+r) / 2)
            if (x >= m*m) and (x < (m+1)*(m+1)):
                return m
            
            if x > m*m:
                l = m + 1
            else:
                r = m - 1
        
        return 1
struct Solution {
    int mySqrt(int x) {
		if(x == 0)
			return 0;

		int l=1;
		int r=x/2+1;
		while( l <= r ) {
			int m = (l+r)/2;
			if(m<=x/m && x/(m+1)<m+1)
				return m;

			if(x/m<m)
				r = m-1;
			else
				l = m+1;
		}

		return 0;
    }
};

以下是我找到的两篇讲解牛顿法的文章,一篇通俗讲解了牛顿法的思想,另一篇推导了牛顿法求平方根的公式。牛顿法求平方根的本质就是在抛物线上任取一点做切线,再把该切线与x轴的交点代入该抛物线方程又得到一根更逼近根的切线,如此迭代最终获得结果。但是就像第一篇文章所说的,牛顿法求函数根,需要该函数有二阶导数,否则牛顿法会在根附近抖动甚至越来越远。

https://www.zhihu.com/question/20690553

http://www.voidcn.com/article/p-btcbtpcx-gk.html

猜你喜欢

转载自blog.csdn.net/tassardge/article/details/84927680