367.验证完全平方数
标签: math
, binary-search
难度: Easy
通过率: 43.97%
原题链接: https://leetcode.com/problems/valid-perfect-square/description/
题目描述
给定一个正整数 num
,如果 num
是一个完全平方数,返回 true
;否则返回 false
。完全平方数是一个整数,是另一个整数的平方,即是某个整数与其自身的乘积。你不能使用任何内置的库函数,比如 sqrt
。
解题思路
可以通过二分查找来确定一个数是否为完全平方数。
首先,我们知道对一个正整数 num
来说,如果它是一个完全平方数,那么它可以表示为一个整数乘以自身。如果我们假设这个整数为 x
,则有 。
利用二分查找的思想:
- 初始化左边界
left
为 1,右边界right
为num
。 - 计算中间值
mid = (left + right) // 2
。 - 计算
mid
的平方mid^2
。 - 如果
mid^2
刚好等于num
,则num
是完全平方数,返回true
。 - 如果
mid^2
小于num
,则说明我们的目标数在mid
的右侧,更新left = mid + 1
。 - 如果
mid^2
大于num
,则说明我们的目标数在mid
的左侧,更新right = mid - 1
。 - 如果循环结束时没有找到,我们返回
false
。
代码实现
- Python
- C++
- JavaScript
- Java
def isPerfectSquare(num):
# 初始条件,左边界为1,右边界为num
left, right = 1, num
while left <= right:
mid = (left + right) // 2
mid_squared = mid * mid
if mid_squared == num:
return True
elif mid_squared < num:
left = mid + 1
else:
right = mid - 1
return False
class Solution {
public:
bool isPerfectSquare(int num) {
long left = 1, right = num;
while (left <= right) {
long mid = left + (right - left) / 2;
long mid_squared = mid * mid;
if (mid_squared == num) {
return true;
} else if (mid_squared < num) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return false;
}
};
function isPerfectSquare(num) {
let left = 1, right = num;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
const mid_squared = mid * mid;
if (mid_squared === num) {
return true;
} else if (mid_squared < num) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return false;
}
public class Solution {
public boolean isPerfectSquare(int num) {
long left = 1, right = num;
while (left <= right) {
long mid = left + (right - left) / 2;
long mid_squared = mid * mid;
if (mid_squared == num) {
return true;
} else if (mid_squared < num) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return false;
}
}
复杂度分析
时间复杂度为 ,其中 是给定的 num
。这是因为我们使用了二分查找的方法,每次查找时都会将问题的规模减少一半。
空间复杂度为 ,因为我们只使用了常数的额外空间来维护变量。