LeetCode力扣题目:69.x的平方根

可以用暴力解决

int mySqrt(int x) {//求x的算数平方根
    long int y = 0;
 	while(y*y<=x)
     {
         y++;
    }
 	return y - 1;
 }

也可以用二分法

int mySqrt(int x) {//求x的算数平方根
	long int y = 0;
	long int left = 0, right = x, mid = left + (right - left) / 2;
	if (x == 1)
		return 1;
	if (x == 0)
		return 0;
	while (left <= right)
	{
		mid = left + (right - left) / 2;
		if (x / mid == mid)
			return mid;
		else if (x / mid > mid)
		{
			left = mid + 1;
		}
		else
			right = mid - 1;
	}
	return right;
}

用二分法解决有一个我觉得很重要的思路就是return right.

我的理解是:

范围再怎么缩小,最终都会到  left==right==mid  的情况

而此时,mid要么比平方根大1,要么小1.

如果x/mid>mid    则说明mid是满足mid*mid<=x 的最大整数,根据我们的循环机制,改变的就是left,最后跳出循环,返回right也满足条件。

如果x/mid<mid    则说明mid是满足mid*mid>x的最小整数,也就是说mid比x的平方根的整数部分大1,根据循环机制,right-1, 跳出循环后返回right 满足条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值