https://leetcode-cn.com/problems/sum-of-square-numbers/
c^2 = a^2 + b^2 (不妨设a < b)
运用了Math的sqrt函数求出与目标值最接近的b
然后把a 从0到b 开始设置双指针来遍历
有一个要注意的点就是这里的a可以等于b,和昨天那个题不同,那个是数组中的不同元素比较,所以才不相等,这个能否相等的问题也需要多注意下。
找的这个问题的原因其实是因为提交错了...
看到实际用例是2 然后返回的是false,因为当时想法其实是觉得平方了再取整数部分的话,再次平方的话,剩下的部分应该没有之前的部分大了,没有把两个相等的平方和考虑进去,需要之后注意一下细节方面
class solution{
public boolean judgeSquareNumber(int c){
//因为要用到平方和,所以我们应该要把不符合的情况排除
if( c < 0) return false;
int i = 0;
int j = (int) Math.sqrt(c);
while( i <= j){
int temp = i*i + j*j;
if(temp == c) return true;
else if(temp < c) i++;
else j--;
}
return false;
}
看官方的题解还有下面几种方法
使用了费马定理:一个非负整数 C 能够表示为两个整数的平方和,当且仅当C 的所有形如 4k+3 的质因子的幂次均为偶数。
使用了sqrt公式,这个和双指针的方法不一样,是遍历每个可以存在的a,找出是不是有这样的一个b满足a^2 +b^2 = C
class solution{
public boolean judgeSquareNumber{
for(long a = 0; a * a <= c; a++){
double b = Math.sqrt(c - a*a);
if(b == (int) b) return true;
}
return false;
}
}