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/midx的最小整数,也就是说mid比x的平方根的整数部分大1,根据循环机制,right-1, 跳出循环后返回right 满足条件

你可能感兴趣的:(LeetCode,leetcode,算法,数据结构)