【LeetCode】367. 有效的完全平方数

一、题目

给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。

说明:不要使用任何内置的库函数,如 sqrt。

示例 1:

输入:16
输出:True

示例 2:

输入:14
输出:False

二、解决

1、

思路:

等差数列: 1 、 3 、 5 、 7 、 … … 、 2 n − 1 1、3、5、7、……、2n-1 13572n1
数列之和: ( 1 + 2 n − 1 ) ∗ n / 2 = n 2 (1+2n-1)*n/2=n^2 1+2n1)n/2=n2

所以从上面可得出从1开始进行奇数累加,累加和就是对应项数的平方。
举几个例子验证下:4=1+3,9=1+3+5,16=1+3+5+7,25=1+3+5+7+9。

代码:

class Solution {
    public boolean isPerfectSquare(int num) {
      if (num < 1) return false;
      for (int i = 1; num > 0; i += 2)
        num -= i;
      return num == 0;
    }
}

时间复杂度: O ( s q r t ( n ) ) O(sqrt(n)) O(sqrt(n))
空间复杂度: O ( 1 ) O(1) O(1)

2、二分查找

思路:

具体请参看【LeetCode】69. x 的平方根对应 1、二分查找 部分。

代码:

class Solution {
    public boolean isPerfectSquare(int num) {
        
        if(num <= 0)  return false;
        long left=0, right=num, mid;
        while (left <= right) {
            mid = left + (right-left)/2;
            if ( mid*mid == num ) {
                return true;
            } else if (mid*mid > num) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return false;
    }
}

时间复杂度: O ( l o g 2 n ) O(log_2n) O(log2n)
空间复杂度: O ( 1 ) O(1) O(1)

3、牛顿迭代法

思路:

具体请参看【LeetCode】69. x 的平方根对应 2、牛顿迭代 部分。

代码:

class Solution {
    public boolean isPerfectSquare(int num) {
        long t = num;
        while (t * t > num) {
            t = (t + num / t) / 2;
        }
        return t * t == num;
    }
}

时间复杂度: O ( l o g n ∗ F ( n ) ) O(logn*F(n)) O(lognF(n)) F ( n ) 为 F ( x ) / F ′ ( x ) 的 n 位 F(n)为F(x)/F'(x)的n位 F(n)F(x)/F(x)n精度的时间复杂度。
空间复杂度: O ( 1 ) O(1) O(1)

三、参考

1、Java Three Solutions 1,3,5,… Sequence/Binary Search/Newton
2、100% faster | Java using binary search

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页