Description:
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
Output: true
Example 2:
Input: 14
Output: false
题意:计算一个正数是否为平方数;
解法一(二分法):可以很容易的想到遍历所有[1,n]中的数,计算平方后是否可以得到这个给定的数,但是,时间复杂度太高;这里,我们可以采用二分法来解决这个问题;定义left = 1, right = num;mid = (left + right) / 2;计算过程如下:
- if mid * mid == num,则找到这个数
- else if mid * mid > num,则令right = mid - 1
- else 令left = mid + 1
Java
class Solution {
public boolean isPerfectSquare(int num) {
long left = 1;
long right = num;
while (left <= right) {
long mid = (left + right) / 2;
if (mid * mid== num) return true;
else if (mid * mid > num) right = mid - 1;
else left = mid + 1;
}
return false;
}
}
解法二(牛顿法):利用牛顿法来求解这个问题,要求一个数的平方根,就是求解方程
f
(
x
)
=
x
2
−
n
u
m
f(x) = x^2 - num
f(x)=x2−num的零点;根据牛顿法的迭代公式有
x
n
+
1
=
x
n
−
f
(
x
)
f
(
x
)
′
x_{n+1} = x_n - \frac{f(x)}{f(x)^{'}}
xn+1=xn−f(x)′f(x)
=
x
n
−
x
2
−
n
u
m
2
x
=x_n-\frac{x^2-num}{2x}
=xn−2xx2−num
=
x
2
+
n
u
m
2
x
=\frac{x^2+num}{2x}
=2xx2+num
Java
class Solution {
public boolean isPerfectSquare(int num) {
long x = num / 2;
while (x * x > num) {
x = (x * x + num) / (2 * x);
}
return x * x == num || num == 1 ? true : false;
}
}