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
这道题是检测数字是否是平方数,题目难度为Medium。
比较简单的方法是用二分查找法,时间复杂度O(logn),具体代码:
class Solution {
public:
bool isPerfectSquare(int num) {
int bgn = 1, end = num;
long long mid;
while(bgn <= end) {
mid = bgn + (end - bgn) / 2;
if(mid*mid == num) return true;
else if(mid*mid < num) bgn = mid + 1;
else end = mid - 1;
}
return false;
}
};
还可以用牛顿迭代法来求平方根,具体方法不知道大家还记不记得(据说初中内容-_-!!),忘了的同学可以看一下这篇博文
http://www.matrix67.com/blog/archives/361
,了解思路后实现没有难度。牛顿迭代法在有限的次数内即可得出结果,所以时间复杂度可以视为O(1)(如果不对请留言指正),具体代码:
class Solution {
public:
bool isPerfectSquare(int num) {
long long x = num;
while(x * x > num)
x = (x + num / x) / 2;
return x * x == num;
}
};
查看讨论时看到还有一种做法,分享给大家。平方数有如下规律:
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;
......
n*n = 1 + 3 + ... + (2n-1) = n(2n-1+1)/2 = n*n;
可以依此规律迭代n次,每次将计数x加2,同时将num减x,直至num小于或等于0,最终num等于0表明num为平方数。由于需要迭代n次,所以时间复杂度为O(sqrt(n)),具体代码:
class Solution {
public:
bool isPerfectSquare(int num) {
int x = 1;
while(num > 0) {
num -= x;
x += 2;
}
return !num;
}
};