为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第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)

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消