题目
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
解题思路
-
二分查找:首先我们要明确二分查找的使用前提是:对于一组排好顺序的数,对于本题来说在寻找平方根时,已经有了顺序(从1到
Math.sqrt(num)
),剩下的只需要根据二分查找的基本思路即可。 -
Java实现:
class Solution {
public boolean isPerfectSquare(int num) {
//二分查找
if (num < 2) {
return true;
}
//确定起始的左端点和右端点
long left = 2;
long right = num / 2;
//x为变化迭代的平方根,check为校验数
long x,check;
while (left <= right) {
x = (left + right) / 2;
check = x * x;
if (check == num) {
return true;
}
if (check < num) {
left = x + 1;
} else {
right = x - 1;
}
}
return false;
}
}
时间复杂度:O(logN)
空间复杂度:O(1)
- 牛顿迭代法:代数推导以及几何推导过程如下
- Java实现:
class Solution {
public boolean isPerfectSquare(int num) {
//选定2为界限
// x^2 与 2x 的交点的横坐标为2
if (num < 2) {
return true;
}
//选定初值,根据x^2 与 2x 两个函数的增长速度可以判断出在x>2之后 x^2的增长速度更快
//所以当x>2时一个数的平方根要小于它的一半
long x = num / 2;
//不断迭代,因为选定的初值大于所要寻找的根
while (x * x > num) {
x = (x + num / x) / 2;
}
return x * x == num;
}
}
时间复杂度:O(logN)
空间复杂度:O(1)