题目
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
示例 1:
输入:16
输出:True
示例 2:
输入:14
输出:False
思路一 二分查找
设置上下界,然后进行判断
class Solution {
public boolean isPerfectSquare(int num) {
if (num == 1) return true;
int l = 2, r = num;
while (l <= r) {
int mid = l + (r - l) / 2;
if ((long)mid * mid == num) {
return true;
}
if ((long)mid * mid > num) { //这里mid*mid 要转型,因为可能超过int范围
r = mid - 1;
} else {
l = mid + 1;
}
}
return false;
}
}
复杂度分析
时间复杂度: O(logN)。
空间复杂度:O(1)。
思路二 牛顿迭代法
参考官方题解
思路步骤
- 去num/2 作为初始值
- 当 x*x > num 时,用牛顿迭代发去下一个值 x=1/2(x+num/x)
- 返回 x*x == num
class Solution {
public boolean isPerfectSquare(int num) {
if (num < 2) return true;
long x = num / 2;
while (x * x > num) {
x = (x + num / x) / 2;
}
return (x * x == num);
}
}
复杂度分析
时间复杂度:O(logN)。
空间复杂度:O(1)。