[LeetCode每日一题] 633. Sum of Square Numbers

120 阅读1分钟

两种解法:遍历法和双指针法。

第一种,遍历法。i从0~c\sqrt c,然后用求ci2\sqrt{c-i^2}是否为整数。

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指针,如果left2+right2<cleft^2+right^2<c,则left++,否则right--。那么这里可能会有疑惑,如果left2+right2<cleft^2+right^2<c,为什么是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
};

上面两种算法的时间复杂度都为O(c)O(\sqrt c),空间复杂度O(1)O(1),无谓哪种更好。现在我想再介绍与双指针法解法相同的另一题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
};

关于这一题,从右上角开始与从左下角开始都是一样的,这里我选择从右上角开始。