367. 有效的完全平方数
给你一个正整数 num
。如果 num
是一个完全平方数,则返回 tru
,否则返回 false
。
完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如 sqrt
。
示例 1:
输入:num = 16
输出:true
解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。
示例 2:
输入:num = 14
输出:false
解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。
提示:
- 1 < = n u m < = 2 3 1 − 1 1 <= num <= 2^31 - 1 1<=num<=231−1
思路:
法一:二分查找
- 注意
num
最大可以取到 2 31 − 1 2^{31} - 1 231−1,在该附近的数平方,会超出int
的范围,要使用long
。
法二:观察法、等差数列
- 平方序列: 1, 4, 9, 16, 25, …
- 间隔: 3, 5, 7, 9, …
间隔为等差数列,使用这个特性可以得到从 1
开始的平方序列。
代码:(Java、C++)
Java
法一:
public class IsPerfectSquare {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = 16;
System.out.println(isPerfectSquare(num));
}
public static boolean isPerfectSquare(int num) {
long l = 1,h = num;
long mid = 0;
while(l <= h) {
mid = l + (h - l) / 2;
if(mid * mid == num) {
break;
}else if(mid * mid > num) {
h = mid - 1;
}else {
l = mid + 1;
}
}
return mid * mid == num;
}
}
法二:
public static boolean isPerfectSquare(int num) {
int addNum = 3;
long sum = 1;
while(sum < num) {
sum += addNum;
addNum += 2;
}
return sum == num;
}
C++
法一:
class IsPerfectSquare {
public:
bool isPerfectSquare(int num) {
long l = 1, h = num, mid;
while (l <= h) {
mid = l + (h - l) / 2;
if (mid * mid == num) {
break;
}
else if (mid * mid > num) {
h = mid - 1;
}
else {
l = mid + 1;
}
}
return mid * mid == num;
}
};
int main() {
IsPerfectSquare i;
int num = 16;
cout << i.isPerfectSquare(num) << endl;
system("pause");
return 0;
}
法二:
class IsPerfectSquare {
public:
bool isPerfectSquare(int num) {
int addNum = 3;
long sum = 1;
while(sum < num) {
sum += addNum;
addNum += 2;
}
return sum == num;
}
};
运行结果:
leetcode运行结果:
复杂度分析:
- 时间复杂度:法一: O ( l o g n ) O(logn) O(logn);法二: O ( n ) O(\sqrt{n}) O(n)。
- 空间复杂度: O ( 1 ) O(1) O(1)。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!