手记

【九月打卡】第42天 数据结构和算法

回溯算法

什么是回溯算法

  • 回溯算法也是一种算法思想
  • 回溯算法是一种渐进式寻找并构建问题解决方式的策略
  • 回溯算法从一个可能的动作开始,如果不行,就回溯选择另外一个,直到将问题解决。
举例说明,就是前面有3个山洞,先走左边的山洞,发现不通,返回到原点,再尝试其他的山洞。

全排列(leetcode - 46)

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

输入:nums = [0,1]
输出:[[0,1],[1,0]]

思路

  1. 用递归模拟出所有情况
  2. 遇到包含重复元素的情况,就回溯
  3. 收集所有到达终点的元素(新数组的长度等于原数组长度),并返回
var permute = function(nums) {
    const res = [];
    const rec = (path) => {
        if(path.length === nums.length) {
            res.push(path);
            return;
        }

        // nums.forEach(n => {
        //     console.log(n);
        //     if(path.includes(n)) {
        //         return;
        //     }
        //     rec(path.concat(n))
        // })

        for(let i = 0; i< nums.length; i++) {
            const n = nums[i];
            if(path.includes(n)) {
                continue;
            }
            rec(path.concat(n))
        }
    }
    rec([]);
    return res;
};

时间复杂度:O(n!)
每次递归循环次数都比上次少1,即n*(n-1)*(n-2)*...*1所以时间复杂度是n的阶乘。

空间复杂度:O(n)
空间复杂度是递归调用栈的深度n,为O(n)

0人推荐
随时随地看视频
慕课网APP