classSolution: defisPerfectSquare(self, num: int) -> bool: i = 1 while i * i < num: i += 1 return i * i == num
这个方法的时间复杂度是O(sqrt(N))
第二招:二分查找
第一种方式显得不够优雅。
因为找到符合条件的i实在是太慢了
所以我们可以想到使用二分查找的方法来加快这一过程。
1 2 3 4 5 6 7 8 9 10
classSolution: defisPerfectSquare(self, num: int) -> bool: l, r = 1, num while l < r: mid = (l + r) // 2 if mid * mid < num: l = mid + 1 else: r = mid return l * l == num
这个方法的时间复杂度是O(log(N)),比第一种方法好,因为开log比根号小
第三招:等差数列
有一个公式
1+3+5+7+...(2N−1)=N2
所以任意一个平方数可以表示成这样的奇数序列和。
1 2 3 4 5 6 7
classSolution: defisPerfectSquare(self, num: int) -> bool: i = 1 while num > 0: num -= i i += 2 return num == 0