69. x 的平方根

69. x 的平方根

官网上Ac,并不是考察点。

 class Solution {
 public:
	 int mySqrt(int x) {
		 return sqrt(x);
	 }
 };

二分法分析:
对于一个非负数n,它的平方根不会大于(n/2+1),画个图 y = x y=\sqrt{x} y=x y = 1 2 x y=\frac{1}{2}x y=21x就知道切点是(1,1)。在[0, n/2+1]这个范围内可以进行二分搜索,求出n的平方根。
[1]注:在中间过程计算平方的时候可能出现溢出,所以用long long
写烂二分法。。。。

class Solution {
 public:
	 int mySqrt(int x) {
		 long long i = 0;
		 long long j = x / 2 + 1;
		 while (i<=j)
		 {
			 long long mid = (i + j) / 2;
			 long long sq = mid*mid;
			 if (sq == x)return mid;
			 else if (sq < x)i = mid+1;
			 else j = mid-1;
		 }
		 return j;
	 }
 };

方法二牛顿法:
[1] [2] 过程推导。
f ( x ) = x 2 − n f(x)=x^{2}-n f(x)=x2n,
x i + 1 = x i − ( x i 2 − n ) / ( 2 ∗ x i ) = x i − x i / 2 + n / ( 2 ∗ x i ) = x i / 2 + n / 2 ∗ x i = ( x i + n / x i ) / 2 x_{i+1}=x_{i} - (x_{i}^2 - n) / (2*x_{i}) = x_{i} - x_{i} / 2 + n / (2*x_{i}) = x_{i} / 2 + n / 2*x_{i} = (x_{i} + n/x_{i}) / 2 xi+1=xi(xi2n)/(2xi)=xixi/2+n/(2xi)=xi/2+n/2xi=(xi+n/xi)/2.

class Solution {
 public:
	 int mySqrt(int x) {
		 if (x == 0)return 0;
		 double res = 1, pre = 0;
		 while (abs(res - pre) > 1e-6)
		 {
			 pre = res;
			 res = (res + x / res) / 2;
		 }
		 return res;
	 }
 };

[1]https://www.cnblogs.com/AnnieKim/archive/2013/04/18/3028607.html
[2]https://en.wikipedia.org/wiki/Newton's_method

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值