长春火车站照片/百度指数免费添加
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<=num<=231−11 <= num <= 2^31 - 11<=num<=231−1
思路:
法一:二分查找
- 注意
num
最大可以取到 231−12^{31} - 1231−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 stubint 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(logn)O(logn)O(logn);法二:O(n)O(\sqrt{n})O(n)。
- 空间复杂度:O(1)O(1)O(1)。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!