# 平方数之和
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c 。
# 示例 1:
输入:c = 5
输出:true
解释:1 * 1 + 2 * 2 = 5
# 示例 2:
输入:c = 3
输出:false
# 示例 3:
输入:c = 4
输出:true
# 示例 4:
输入:c = 2
输出:true
# 示例 5:
输入:c = 1
输出:true
# 提示:
- 0 <= c <= 231 - 1
# 分析
对于给定的非负整数 c,需要判断是否存在整数 a 和 b,使得 a^2 + b^2 = c。
所有问题的通用解法 -> 暴力求解。
# 暴力解法
- a --> sqrt(c)
- b --> ? = sqrt(c - a*a)
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
}
# 双指针优化(官方题解)
a取0, b取 sqrt(c), 开始遍历。
- a^2 + b^2 = c, return true
- a^2 + b^2 < c, a + 1
- a^2 + b^2 > c, b - 1
当 a === b, return false
var judgeSquareSum = function(c) {
let left =0
let right = parseInt(Math.sqrt(c))
while(left<=right){
let res = left*left + right*right
if(res === c) return true
else if(res > c) right--
else left++
}
return false
};