633. 平方数之和
2024.9.11
题目
给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a2 + b2 = c
。
0 <= c <= 2的31次方 - 1
示例
示例 1:
输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5
示例 2:
输入:c = 3
输出:false
反思
1.不要想当然的认为这道题有一致的解法,虽然也可以用某种方式去做,但很可能有更简单的方式。
2.千万注意题目中给值的边界,如本题0 <= c <= 2的31次方
,前后两个边界都要考虑,一个是ab均有可能为0,另一个是ab都有可能不能被int存放。
题解1-square
将数组nums的值
和它对应的索引
存入哈希表作为键值对,利用哈希表查询时间复杂度为O(1),查询nums[i]
是否存在。
class Solution {
public:
bool judgeSquareSum(int c) {
for (long a = 0; a * a <= c; ++a) {
long b_squared = c - a * a;
long b = std::sqrt(b_squared);
if (b * b == b_squared) { // 如果 b 是整数,那么 b_squared 是完全平方数
return true;
}
}
return false;
}
};
题解2-双指针
来自力扣官方题解
不失一般性,可以假设 a≤b。初始时 a=0,b=更号c ,进行如下操作:
class Solution {
public:
bool judgeSquareSum(int c) {
long left = 0;
long right = (int)sqrt(c);
while (left <= right) {
long sum = left * left + right * right;
if (sum == c) {
return true;
} else if (sum > c) {
right--;
} else {
left++;
}
}
return false;
}
};