LeetCode双指针:平方数之和
题目描述
给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a2 + b2 = c
。
示例 1:
输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5
示例 2:
输入:c = 3
输出:false
解题思路1:枚举法
首先对c进行开方,作为遍历的一个上限,然后从0
到根号
c
\sqrt{c}
c,用
c
−
a
∗
a
\sqrt{c-a*a}
c−a∗a再开根号,判断是否满足a*a+b*a==c
代码1
class Solution {
public boolean judgeSquareSum(int c) {
int max = (int)Math.sqrt(c);
for (int a = 0; a <= max; a++) {
int b = (int)Math.sqrt(c - a * a);
if (a * a + b * b == c) return true;
}
return false;
}
}
解题思路2:双指针法
由于 a 和 b 的范围均为 [0, c \sqrt{c} c],因此我们可以使用「双指针」在 [0, c \sqrt{c} c] 范围进行扫描:
小于 c :左边的元素都小于当前元素,只能下移,相当于low++
。此时排除的是黄色格子以及左边同行的元素,都小于 c
,所以不会错过正确答案。
大于 c :下面的元素都大于当前元素,只能左移,相当于high--
。此时排除的是黄色格子以及下方同列的元素,都大于 c
,所以不会错过正确答案。
代码2
class Solution {
public boolean judgeSquareSum(int c) {
long a = 0, b = (long) Math.sqrt(c);
while (a <= b) {
long cur = a * a + b * b;
if (cur == c) {
return true;
} else if (cur > c) {
b--;
} else {
a++;
}
}
return false;
}
}