两种解法:遍历法和双指针法。
第一种,遍历法。i从0~,然后用求是否为整数。
var judgeSquareSum = function(c) {
for (let i = 0; i*i <= c; i++) {
let j = Math.sqrt(c-i*i)
if (Math.floor(j)==Math.ceil(j)) return true
}
return false
};
第二种,双指针法。left和right指针,如果,则left++,否则right--。那么这里可能会有疑惑,如果,为什么是left++而不是right++呢?这里可以看下大佬的解释为什么双指针不会错过正确答案?本质是二维矩阵搜索。
var judgeSquareSum = function(c) {
let left = 0, right = Math.floor(Math.sqrt(c))
while (left<=right) {
let sum = left*left+right*right
if (sum==c) return true
else if (sum<c) left++
else right--
}
return false
};
上面两种算法的时间复杂度都为,空间复杂度,无谓哪种更好。现在我想再介绍与双指针法解法相同的另一题240. Search a 2D Matrix II .代码贴在下面:
var searchMatrix = function(matrix, target) {
const m = matrix.length, n = matrix[0].length
let i = 0, j = n-1
while (i<m&&j>=0) {
if (matrix[i][j] == target) return true
else if (matrix[i][j] > target) j--
else i++
}
return false
};
关于这一题,从右上角开始与从左下角开始都是一样的,这里我选择从右上角开始。