633. 平方数之和
题目
给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a2 + b2 = c
。
示例 1:
输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5
示例 2:
输入:c = 3
输出:false
提示:
0 <= c <= 231 - 1
思路
分析此题,需要两个整数的和等于C,那么一个数的平方的情况呢,就是C开方。比如5,开方后是2.23,向下取整得2,也就是最大的整数平方就是2的平方了,更大的整数比如3,平方后肯定大于C,所以不用考虑。
由于这里是平方相加,负数的情况下也会被转换为正数,所以不用考虑负数参与。平方后和正数是一样的。
那也就是说最大的解的范围就在[1, 2]
之间,所以我们用双指针遍历。之后的解题思路和两数之和的逻辑类似。
我自己在做题时有遇到一个问题,就是这里是用C开方来确定最大值的,那么是不是循环中就不会有比C大的情况了?
这其实是个误区。首先我们确定解的范围的最大值是在一个数平方的情况下讨论的,以25为例,他开方后是5。如果解的最大值是6,6的平方是36,直接就比C大了所以不可能。
而0的平方+5的平方就算是25的解,这里也提醒我们解的范围也要包含0。
另外允许l==r
,因为2= 1^2 + 1^2
class Solution {
public boolean judgeSquareSum(int c) {
int max = (int) Math.sqrt(c);
int l = 0, r = max, s = 0;
int[] range = new int[max + 1];
for (int i = 0; i < range.length; i++) {
range[i] = s++;
}
while (l <= r) {
double res = Math.pow(range[l], 2) + Math.pow(range[r], 2);
if (res == c) {
return true;
} else if (res < c) {
l++;
} else {
r--;
}
}
return false;
}
}