题目描述
给定一个非负整数c,判断是否存在两个整数a和b,使得a^2 + b^2 = c
解题思路
将给定的非负整数c看作是根号c的平方,使用双指针,一大一小向中间逼近,如果两个指针平方之和大于c,说明右指针过大,则右指针递减,反之左指针递增。当左指针大于右指针,说明给定的非负整数c不是两个数的平方之和。
实现代码(js)
let judgeSquareSum = function (c) {
// 定义左右指针 左指针从1开始递增 右指针从给定数值的开方值开始递减
let a = 1,
b = Math.sqrt(c);
// 如果右指针为整数,说明给定数值为0和右指针数值的平方和
if (b % 1 === 0) return true;
// 如果右指针不为整数,则向下取整开始递减
b = Math.floor(b);
// 如果左指针大于右指针,则给定数值不是两个数的平方之和
while (a <= b) {
if (a * a + b * b === c) return true;
// 如果左右指针平方之和小于给定数值,则左指针递增
else if (a * a + b * b < c) a++;
// 如果左右指针平方之和大于给定数值,则右指针递减
else b--;
}
return false;
};
总结
看到题目的第一反应就是用双指针,略微思考后觉得双指针可以实现。解这道题的关键是将c看作是根号c的平方,这样就能确定双指针中较大的那个指针的大小,从而确定双指针的范围。剩下的就是一些小细节,比如a可以从1开始递增,只要在循环前先判断c是否是右指针的平方,如果是则说明c=0*0+b^b;比如两个指针是可以相等的(c=2)等等。