LeetCode 633平方数之和三大解法
一、题目
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。
二、示例
示例 1:
输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5
示例 2:
输入:c = 3
输出:false
示例 3:
输入:c = 4
输出:true
示例 4:
输入:c = 2
输出:true
示例 5:
输入:c = 1
输出:true
三、解法思路:
(一)暴力枚举,时间复杂度O(n^2).
算法描述:通过双重遍历枚举每一种可能性,如果有一种符合条件,就符合题意,输出true.
(二)使用sqrt函数。
遍历a ,找出对应的B。
(三)双指针法。
a为左指针,b为右指针,如果a2+b2>c,a+1,如果等于,返回true,如果不等于,b+1.
(四)数学公式,费马公式。如果一个数可以表示为两个数的平方和,那么 的所有形如 4k + 34k+3 的质因子的幂均为偶数。
四、代码
(一)
class Solution {
public boolean judgeSquareSum(int c) {
for (long a = 0; a < c; a++) {
for(long b = 0; b < c;b++)
if (a*a + b*b == c*c) {
return true;
}
}
return false;
}
}
(二)
class Solution {
public boolean judgeSquareSum(int c) {
for (long a = 0; a * a <= c; a++) {
double b = Math.sqrt(c - a * a);
if (b == (int) b) {
return true;
}
}
return false;
}
}
(三)
class Solution {
public boolean judgeSquareSum(int c) {
long a=0;
long b=(long)Math.sqrt(c);
while(a<=b){
if(a*a+b*b==c)
return true;
else if(a*a+b*b<c)
a++;
else
b--;
}
return false;
}
}
(四)官网解法,引用代码。
class Solution {
public boolean 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;
}
}