题目描述
方法一:顺序遍历
思路:
定义变量 a 从 0 到 sqrt(c)遍历,判断 c - a * a 的开方是不是个整数,如果是,则存在两个整数满足题意,若遍历结束还没有,则不存在。
代码:
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 == 0) {
return true;
}
}
return false;
}
};
方法二:碰撞指针
思路
- 使用两个指针i,j,其中 i 初始值为0,j 初始值为 sqrt( c ) + 1;
- 若 i^2+ j^2 > c,则 --j;
- 若 i^2+ j^2 < c,则 ++i;
- 若 i^2+ j^2 = c,则直接返回true;
- 若直至循环结束都没有返回true,则说明不存在。
代码
class Solution {
public:
bool judgeSquareSum(int c) {
long i = 0, j = sqrt(c) + 1, total;
while (i <= j) {
total = i * i + j * j;
if (total > c) {
--j;
}
else if (total < c) {
++i;
}
else {
return true;
}
}
return false;
}
};