D4-双指针算法-练习
力扣633. 平方数之和
题目链接:633. 平方数之和
思路
观察题目 aa+bb=c:很明显其实最笨的办法就是枚举a和b,再进一步想,如果是O(n^2)的复杂度,那不就是一个二维空间的搜索,每个维度上都从0开始,所组成的二维矩阵上的每一个值就是按照题目中的算法而来,并且这个二维矩阵是排好序的,所以,这道题就转化成了二维矩阵上搜索目标值问题,详细算法见力扣167题题解。这是一类大型的模板题目,一定要注意甄别,发现之后,马上套用模板。
代码
注意:
1、根据算法,明显的,i从0,那么j应该从哪里入手呢,不妨把i=0带入:i * i+j * j=c中,可知,j最大是sqrt ( c ).
2、因为可能会超出int 范围,所以全用long long
class Solution {
public:
bool judgeSquareSum(int c) {
if (c == 0) {
return true;
}
long long l = 0, r = sqrt(c);
while (l <= r) {
long long tmp = l * l + r * r;
if (tmp > c) {
r--;
}
else if (tmp < c) {
l++;
}
else {
return true;
}
}
return false;
}
};