题目链接
LeetCode 69. x 的平方根[1]
题目描述
示例1
输入: 4 输出: 2
示例2
输入: 8 输出: 2 解释: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
题解
牛顿法
梯度下降法
二分法
我运行了一下从 100 到 10000 每 100个数开根号的结果,统计了一下三种方法需要的计算次数,如下图所示:
代码
c++
classSolution { public: intmySqrt(intx) { longy=int(newtonSqrt(x)) +1; returny*y>x?y-1 : y; } doublenewtonSqrt(doublen) { doublex0=n; while (abs(x0*x0-n) >=1e-6) { x0=0.5*(n/x0+x0); } returnx0; } doublebinarySqrt(doublen) { doublel=0, r=n; while (r-l>=1e-6) { doublem= (l+r)/2; if (m*m<n) l=m; elser=m; } returnr; } // 超时 doublegdSqrt(doublen) { doublex0=n; while (abs(x0*x0-n) >=1e-6) { doublelr=min(1e-3, 1e-1*x0/(x0*x0-n)); x0=x0-lr*(x0*x0-n); } returnx0; } };
参考资料
[1]
LeetCode 69. x 的平方根: https://leetcode-cn.com/problems/sqrtx/
作者简介:godweiyang,知乎同名,华东师范大学计算机系硕士在读,方向自然语言处理与深度学习。喜欢与人分享技术与知识,期待与你的进一步交流~