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参考: tstsugeg-[leetcode] 367. Valid Perfect Square
方法一:
一完全平方数可分解为1 + 3 + 5 + 7 + ...
因为
(x + 1) ^ 2 - x ^ 2 = 2 * x + 1。
完全平方数是一系列奇数之和,
例如:
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 boolean isPerfectSquare2(int num) {
int k = 1;
while (num > 0) {
num = num - k;
k = k + 2;
}
return 0 == num;
}
方法二:牛顿迭代法,此方法效率最高!
设r是
的根,选取
作为r的初始近似值,过点
做曲线
的切线L,L的方程为
,求出L与x轴交点的横坐标
,称x
1为r的一次近似值。过点
做曲线
的切线,并求该切线与x轴交点的横坐标
,称
为r的二次近似值。重复以上过程,得r的近似值序列,其中,
称为r的
次近似值,上式称为
牛顿迭代公式。












用牛顿迭代法解非线性方程,是把非线性方程
线性化的一种近似方法。把
在点
的某邻域内展开成泰勒级数
,取其线性部分(即泰勒展开的前两项),并令其等于0,即
,以此作为非线性方程
的近似方程,若
,则其解为
, 这样,得到牛顿迭代法的一个迭代关系式:
。引自:
百度百科-牛顿迭代法









根据以上迭代公式,
我们不断用f(x)=x^2-num的切线来逼近方程x^2-num=0的根。根号num实际上就是x^2-num=0的一个正实根,这个函数的导数是2x。也就是说,函数上任一点(x,f(x))处的切线斜率是2x。那么,x-f(x)/(2x)就是一个比x更接近的近似值。代入f(x)=x^2-num得到x-(x^2-num)/(2x),也就是(x+num/x)/2。此段引自:matrix67-牛顿迭代法快速寻找平方根
public boolean isPerfectSquare(int num) {
long x = num;
while (x * x > num) {
x = (x + num / x) / 2;
}
return x * x == num;
}
方法三:二分查找,效率比方法一好,但是不如牛顿迭代法。
public boolean isPerfectSquare3(int num) {
if (num < 0) return false;
long i = 0;
long j = num;
while (i <= j) {
long m = (i + j) / 2;
long m2 = m * m;
if (m2 == num) return true;
if (m2 < num) i = m + 1;
else j = m - 1;
}
return false;
}