633.平方数之和
题目
给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a^2 + b^2 = c
。
示例 1:
输入:c = 5 输出:true 解释:1 * 1 + 2 * 2 = 5
示例 2:
输入:c = 3 输出:false
提示:
0 <= c <= 231 - 1
想法
因为最近一直在写双指针相关的题目,所以可能惯性思维拿到这题第一反应就是可以用双指针
a^2 + b^2 = c
,a最小值可以为0,b的最大值一定是 c 的开根号然后去除小数点。(不能四舍五入)
比如
- 1 * 1 + 2 * 2 = 5 其中最大值2,是5的开根号去小数点
- 2 * 2 + 2 * 2 = 8 其中最大值2,是8的开根号去小数点
- 0 * 0 + 3 * 3 = 9 其中最大值3,是9的开根号正好是整数
了解了这部分取值规则,代码就很好写了
实现
/**
* @param {number} c
* @return {boolean}
*/
var judgeSquareSum = function(c) {
let l = 0;
let r = Math.floor(Math.sqrt(c));
while(l <= r){
let lVal = Math.pow(l,2);
let rVal = Math.pow(r,2);
if(lVal + rVal == c) return true;
if(lVal + rVal < c) l ++;
if(lVal + rVal > c) r --;
}
return false;
};
看了解析之后,觉得另外一种写法真不错,核心思想还是要用到开根号sqrt
var judgeSquareSum = function(c) {
for (let a = 0; a * a <= c; a++) {
const b = Math.sqrt(c - a * a);
if (b === parseInt(b)) {
return true;
}
}
return false;
};