文章目录
- 1. 题目来源
- 2. 题目解析
1. 题目来源
链接:633. 平方数之和
题单:
- 滑动窗口与双指针(定长/不定长/单序列/双序列/三指针)
- §3.1 相向双指针
2. 题目解析
枚举思路:
- 直接枚举 a 即可,然后反向算出 b,再进行判断即可。
- 注意 a 的话只需要枚举到 2a^2>c 即可,避免后续的重复枚举。
- 该过程相当于直角三角形的枚举边由长到短再到长的过程。
- 避免重复枚举
- 也可进行不等式推导进行次结论。
- 简单来说就是 a=3,b=5 的话,那么a不需要枚举到5,因为当a枚举到3的时候就已经可以得到答案了。
同向双指针思路:
- 直接枚举 a,b
- 时间复杂度: O ( c ) O(\sqrt c) O(c)
- 空间复杂度: O ( 1 ) O(1) O(1)
枚举
class Solution {
public:
bool judgeSquareSum(int c) {
for (int a = 0; a * a <= c / 2; a ++ ) {
int b = sqrt(c - a * a);
if (a * a + b * b == c)
return true;
}
return false;
}
};
同向双指针
class Solution {
public:
bool judgeSquareSum(int c) {
int a = 0, b = sqrt(c);
while (a <= b) {
if (a * a == c - b * b) return true;
if (a * a > c - b * b) b -- ;
else a ++ ;
}
return false;
}
};