代码随想录Day28打卡 回溯算法(4)

44 阅读1分钟

46. 全排列

因为【1,2,3】和【2,1,3】都是合法的排列,所以在for loop循环的时候,不是从上一个开始的index的下一个开始的,而是从0开始。那为了确保不会有重复,我们用一个visited数组来记录。

var permute = function(nums) {
    const res = [], path = []
    const visited = new Array(nums.length)
    const dfs = () => {
        if (path.length === nums.length) {
            res.push([...path])
            return
        }
        for (let i = 0; i < nums.length; i++) {
            if (visited[i]) {
                continue
            }
            path.push(nums[i])
            visited[i] = true
            dfs()
            visited[i] = false
            path.pop()
        }
    }

    dfs()
    return res
};

47 全排列2

  1. 先排序 2. 对于一样的数字,确保相对顺序,通过查看used数组可以做到
var permuteUnique = function (nums) {
    nums.sort((a, b) => a - b)
    const used = new Array(nums.length).fill(false)
    const res = [], path = []

    const dfs = () => {
        if (path.length === nums.length) {
            res.push([...path])
            return
        }
        for (let i = 0; i < nums.length; i++) {
            if (used[i]) {
                continue
            }
            // 确保相对位置不变, 第一个和第二个数字一样大,一定要确保第一个数字被用过
            if (i > 0 && nums[i] === nums[i - 1] && !used[i - 1]) {
                continue
            }
            path.push(nums[i])
            used[i] = true
            dfs()
            path.pop()
            used[i] = false
        }
    }

    dfs()

    return res
};

491 非递减子序列

因为可以跳过一些数,所以用回溯而不是动态规划

var findSubsequences = function(nums) {
    const res = [], path = []
    const dfs = (start) => {

        if (path.length >= 2) {
            res.push([...path])
        }
        const used = new Set()
        for (let i = start; i < nums.length; i++) {
            if (path.length > 0 && path[path.length - 1] > nums[i]) {
                continue
            }
            // 如果一个数在一层用过了,跳过
            if (used.has(nums[i])) {
                continue
            }
            used.add(nums[i])
            path.push(nums[i])
            dfs(i + 1)
            path.pop()
        }
    }
    dfs(0)
    return res
};