Given a positive integer num, write a function which returns True if num is a perfect square else False.
Note: Do not use any built-in library function such as sqrt
.
Example 1:
Input: 16 Returns: True
Example 2:
Input: 14 Returns: False
思路1:由于不能使用sqrt()方法,所以 i 从1循环到 n/2,判断i的平方是否等于num,时间复杂度为O(n/2)
public boolean isPerfectSquare(int num) {
int a = num / 2 + num % 2; //不知道能否使用 %
for(int i = 1; i < a; i++) {
if(i * i == num) return true;
}
return false;
}
思路2:
1 = 1
4 = 1 + 3
9 = 1 + 3 + 5
16 = 1 + 3 + 5 + 7
………………………………
根据上面的规律,设置一个标志位,从1开始自增,每次加2,直到和num相等,时间复杂度O(sart(n))
public boolean isPerfectSquare(int num) {
int i = 1;
while(num > 0) {
num -= i;
i += 2;
}
return num == 0;
}
思路3:二分法,时间复杂度O(logn),在时间复杂度上,O(logn) < O(sqrt(n))
public boolean isPerfectSquare(int num) {
int l = 1;
int r = num;
while(l <= r) {
long m = (l + r) >>> 1; // 注意,l + r可能超过int类型表示范围,>>>无符号右移
if(m * m == num) return true;
else if(m * m < num) {
l = (int)m + 1;
}else {
r = (int)m - 1;
}
}
return false;
}