Day6-回溯

74 阅读1分钟

回溯的想法:

未命名绘图 (1).png

力扣46-全排列

image.png

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
    let list = []
    function backTrack(list, tmp, nums) {
        if (tmp.length === nums.length) {
            return list.push([...tmp])
        }
        for(let i = 0; i < nums.length; i++) {
            if (tmp.includes(nums[i])) {
                continue
            }
            tmp.push(nums[i])
            backTrack(list, tmp, nums)
            tmp.pop()
        }
    }
    backTrack(list, [], nums)
    return list
};

这边文章思路写的很清晰,留作参考:juejin.cn/post/705193…

力扣79-单词搜索

image.png

image.png

/**
 * @param {character[][]} board
 * @param {string} word
 * @return {boolean}
 */
 var exist = function(board, word) {
    let row = board.length;
    let col = board[0].length;
    for (let i = 0; i < row; i++) {
        for (let j = 0; j < col; j++) {
            // 把board的坐标和word的当前索引传入
            const result = find(i, j, 0)
            if (result) {
                return result;
            }
        }
    }
    return false;
    
    function find(i, j, cur) {
        // 边界条件
        if (i>=row || i<0) {
            return false
        }
        if (j>=col || j<0) {
            return false
        }

        let letter = board[i][j]
        // 不想等则不继续走这个路径了,终止
        if (letter !== word[cur]) {
            return false
        }

        // 成功条件
        if (cur === word.length - 1) {
            return true
        }

        // 防止回溯到上一个继续,case3
        board[i][j] = null;
        let res = find(i+1, j, cur+1) ||
                  find(i-1, j, cur+1) ||
                  find(i, j+1, cur+1) ||
                  find(i, j-1, cur+1)
        board[i][j] = letter;
        return res
    }
};

参考:github.com/course-dash…