LeetCode 69. Sqrt(x)
领扣 69. x 的平方根
求非负整数x
的平方根,向下取整
易错点
mid
为0
时会造成分母为0
使用判断条件mid * mid <= x
会造成溢出,应该改为mid <= x / mid
class Solution {
public:
int mySqrt(int x) {
// 如果left初始为0,则可能mid为0
// 在后续代码中mid需要做分母
// 故单独对0进行处理
if( x == 0 )
return 0;
int left = 1, right = sqrt( INT_MAX );
while( left <= right )
{
int mid = left + ( right - left ) / 2;
// 情况1:mid * mid <= x && x < (mid + 1) * (mid + 1)
if( mid <= x / mid && x / ( mid + 1 ) < mid + 1 )
return mid;
else if( x / mid < mid ) // 情况2:x < mid * mid
right = mid - 1;
else // 情况3:(mid + 1) * (mid + 1) <= x
left = mid + 1;
}
return -1;
}
};
LeetCode 367. Valid Perfect Square
领扣 367. 有效的完全平方数
判断正整数num
是否为完全平方数
同样需要防止mid * mid
溢出
class Solution {
public:
bool isPerfectSquare(int num) {
int left = 1, right = sqrt( INT_MAX );
while( left <= right )
{
int mid = left + ( right - left ) / 2;
if( mid == num / mid ) // 情况1:num == mid * mid
return mid * mid == num;
else if( num / mid < mid ) // 情况2:num < mid * mid
right = mid - 1;
else // 情况3:mid > mid * mid
left = mid + 1;
}
return false;
}
};