1.4 LeetCode(剑指Offer)

121 阅读1分钟

34.二叉树中和为某一值的路径

// 时间复杂度和空间复杂度都好高
var pathSum = function(root, target) {
    let res = [];
    let arr = [];
    helper(res, arr, root, target);
    return res;
};
var helper = (res, arr, root, target)=>{
    if(root==null){
        //不能在这里判断target为0,因为到了叶子节点是左右两边都为Null的
        return;
    }
    arr.push(root.val);
    let tmp1 = arr.slice(0);
    let tmp2 = arr.slice(0);
    if(root.left==null&&root.right==null&&target==root.val){
        res.push(tmp1);
        return;
    }
    helper(res, tmp1, root.left, target-root.val);
    helper(res, tmp2, root.right, target-root.val);
}

13.机器人的运动范围

//和12题非常相似的一题。我实在是受不了我总是把while写成if了。
//另外需要注意fill后面不能直接跟new Array,这样每一个元素的数组都是一样的,不是独立的一个。
//千万不要忘了map....
var movingCount = function (m, n, k) {
    if (m == 0 || n == 0) {
        return 0;
    }
    let store = new Array(m).fill(true).map(item => new Array(n).fill(true))
    var helper = (i, j) => {
        let tmp = 0;
        let a = i;
        let b = j;
        while (a) {
            tmp += a % 10;
            a = Math.floor(a / 10);
        }
        while (b) {
            tmp += b % 10;
            b = Math.floor(b / 10);
        }
        if (tmp > k || i >= m || j >= n || store[i][j] == false) {
            return 0;
        }
        store[i][j] = false;
        return 1 + helper(i + 1, j) + helper(i, j + 1);
        //上面一行改成res++和两次helper也可以。
    }

    return helper(0, 0);
};