美文网首页
633. 平方数之和

633. 平方数之和

作者: Joyconfirmed | 来源:发表于2021-06-08 15:54 被阅读0次

这道题有几个数学做法比较有意思。

题目描述

给定一个非负整数c,你要判断是否存在两个整数ab,使得a^2+b^2=c

解法

1. 利用等差数列公式

已知等差数列公式:
1 + 3 + 5 + ... + 2n-1 = (1 + 2n - 1) * n / 2 = n^2
而且有
n^2 + 2(n+1) - 1 = (n + 1) ^ 2
因此可以将c每次减少一个奇数(每次奇数增大2);看剩下的是否为一个平方数。
第一次减1,共减1的平方;
第二次减3,共减2的平方;
第三次减5,共减3的平方;
...
以此类推,直到减后为负数。

class Solution {
public:
  bool judgeSquareSum(int c) {
    int num1 = sqrt(c);
    if (num1 * num1 == c) { // 判断c本身就是一个平方数
      return true;
    }
    num1 = c;
    for (int i = 1; i <= num1; i += 2) {
      num1 -= i; // 每次减去一个奇数
      int num2 = sqrt(num1);
      if (num2 * num2 == num1) {
        return true;
      }
    }
    return false; 
  }
};

2. 利用费马平方和定理

费马平方和定理(证明):

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

因此我们需要对 c 进行质因数分解,再判断所有形如 4k + 3 的质因子的幂是否均为偶数即可。

class Solution {
public:
    bool judgeSquareSum(int c) {
        for (int base = 2; base * base <= c; base++) {
            // 如果不是因子,枚举下一个
            if (c % base != 0) {
                continue;
            }

            // 计算 base 的幂
            int exp = 0;
            while (c % base == 0) {
                c /= base;
                exp++;
            }

            // 根据 Sum of two squares theorem 验证
            if (base % 4 == 3 && exp % 2 != 0) {
                return false;
            }
        }

        // 例如 11 这样的用例,由于上面的 for 循环里 base * base <= c ,base == 11 的时候不会进入循环体
        // 因此在退出循环以后需要再做一次判断
        return c % 4 != 3;
    }
};

3. 使用sqrt函数

枚举,本题 c 的取值范围在 [0,2^31−1],因此在计算的过程中可能会发生 int 型溢出的情况,需要使用 long 型避免溢出。

class Solution {
public:
  bool judgeSquareSum(int c) {
    for (long a = 0; a * a <= c; a++) {
      double b = sqrt(c - a * a)'
      if (b == (int)b) {
        return ture;
      }
    }
    return false;
  }
};

4. 双指针

class Solution {
public:
    bool judgeSquareSum(int c) {
        long left = 0;
        long right = (int)sqrt(c);
        while (left <= right) {
            long sum = left * left + right * right;
            if (sum == c) {
                return true;
            } else if (sum > c) {
                right--;
            } else {
                left++;
            }
        }
        return false;
    }
};

相关文章

  • 力扣每日一题:633.平方数之和

    633.平方数之和 https://leetcode-cn.com/problems/sum-of-square-...

  • 8.数学(八)

    题目汇总https://leetcode-cn.com/tag/math/633. 平方数之和简单[✔]640. ...

  • 633. 平方数之和

    给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c。 示例1: 示例2...

  • 633. 平方数之和

    这道题有几个数学做法比较有意思。 题目描述 给定一个非负整数c,你要判断是否存在两个整数a和b,使得a^2+b^2...

  • 633. 平方数之和

    1.题目 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c 。 示...

  • leetcode 633. 平方数之和

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

  • 633. 平方数之和——双指针

    这个题我抄了两种解法,因为我是看一个目录在做题,所以第一反应双指针,但是这个地方要注意这两个数字可以相同,我之前左...

  • 633. 平方数之和 Sum of Square Numbers

    【题目描述】给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c。 【示...

  • 双指针:633. 平方数之和(中等)

    给定一个非负整数c,你要判断是否存在两个整数a和b,使得a2+ b2= c。 示例 1: 输入:c = 5输出:t...

  • 平方数之和

    题目: 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。 示例: 输入...

网友评论

      本文标题:633. 平方数之和

      本文链接:https://www.haomeiwen.com/subject/kzideltx.html