问题:
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
解决:
【题目要求】检验一个数是否是完全平方数。
① 直接判断,调用java中封装的方法
public class Solution { //0ms
public boolean isPerfectSquare(int num) {
if(num <= 0) return false;
double tmp = Math.sqrt(num);
return (int)tmp * tmp == num;
}
}
② 我们将num除以2,得到一个新的数字x,此时,若x * x > num,则继续除以2,若x * x < num,则遍历x到2 * x范围内的数,看是否有符合条件的值。
public class Solution{//2ms
public boolean isPerfectSquare(int num){
if(num == 1) return true;
long x = num / 2;//必须使用long类型否则结果不正确
long multi = x * x;
while(multi > num){
x = x / 2;
multi = x * x;
}
for (long i = x;i <= 2 * x ; ++ i ) {
if(i * i == num) return true;
}
return false;
}
}
进化版:
public class Solution {//0ms
public boolean isPerfectSquare(int num) {
if(num <= 0) return false;
long x = num;
while (x * x > num) {
x = (x + num / x) / 2;
}
return x * x == num;
}
}
③ 折半查找法。
public class Solution {//0ms
public boolean isPerfectSquare(int num) {
if(num == 0) return false;
long start = 0;//必须为long类型!!否则超时。
long end = num;
while(start <= end){
long mid = (end - start) / 2 + start;
if (mid * mid == num) return true;
else if(mid * mid < num) start = mid + 1;
else end = mid - 1;
}
return false;
}
}
④ 纯数学方法:完全平方数的性质——完全平方数是一系列奇数之和,例如:
1 = 1
4 = 1 + 3
9 = 1 + 3 + 5
16 = 1 + 3 + 5 + 7
25 = 1 + 3 + 5 + 7 + 9
36 = 1 + 3 + 5 + 7 + 9 + 11
....
1+3+...+(2n-1) = (2n - 1 + 1) * n / 2 = n* n
等差数列通项公式、求和公式
由以上性质,可以得到一种解决方法:
public class Solution {//1ms
public boolean isPerfectSquare(int num) {
if(num == 0) return false;
int i = 1;
while(num > 0){
num -= i;
i += 2;
}
return num == 0;
}
}