LeetCode 633. 平方数之和

目录结构

1.题目

2.题解

2.1枚举+二分查找

2.2sqrt()函数

2.3费马平方和定理


1.题目

给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。

示例:

输入: 5
输出: True
解释: 1 * 1 + 2 * 2 = 5
 


输入: 3
输出: False

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-square-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.题解

2.1枚举+二分查找

public class Solution633 {

    @Test
    public void test633() {
        System.out.println(judgeSquareSum(5));
    }

    public boolean judgeSquareSum(int c) {
        for (long a = 0; a * a <= c; a++) {
            int b = c - (int) (a * a);
            if (binary_search(0, b, b)) {
                return true;
            }
        }
        return false;
    }

    public boolean binary_search(long s, long e, int n) {
        if (s > e) {
            return false;
        }
        long mid = (s + e) / 2;
        if (mid * mid == n) {
            return true;
        }
        if (mid * mid > n) {
            return binary_search(s, mid - 1, n);
        }
        return binary_search(mid + 1, e, n);
    }
}
  • 时间复杂度:O(\sqrt{c}*logc))
  • 空间复杂度:O(logc)

2.2sqrt()函数

public class Solution633 {

    @Test
    public void test633() {
        System.out.println(judgeSquareSum(5));
    }

    public boolean judgeSquareSum(int c) {
        for (long a = 0; a * a <= c; a++) {
            long b = (long) Math.sqrt(c - a * a);
            if (b * b == c - a * a) {
                return true;
            }
        }
        return false;
    }
}
  • 时间复杂度:O(\sqrt{c})
  • 空间复杂度:O(1)

2.3费马平方和定理

一个非负整数 c能够表示为两个整数的平方和,当且仅当 cc的所有形如 4k+3的质因子的幂次均为偶数。

public class Solution633 {

    @Test
    public void test633() {
        System.out.println(judgeSquareSum(5));
    }

    public boolean judgeSquareSum(int c) {
        for (int i = 2; i * i <= c; i++) {
            int count = 0;
            if (c % i == 0) {
                while (c % i == 0) {
                    count++;
                    c /= i;
                }
                if (i % 4 == 3 && count % 2 != 0) {
                    return false;
                }
            }
        }
        return c % 4 != 3;
    }
}
  • 时间复杂度:O(\sqrt{c})
  • 空间复杂度:O(1)

你可能感兴趣的:(LeetCode,leetcode)