首页 > 编程语言 >代码随想录算法训练营第29天 | 491.递增子序列 、46.全排列 、47.全排列 II

代码随想录算法训练营第29天 | 491.递增子序列 、46.全排列 、47.全排列 II

时间:2024-06-05 22:33:45浏览次数:16  
标签:排列 const nums 46 随想录 return length used path

491.递增子序列

本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。
https://programmercarl.com/0491.递增子序列.html
视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v

关键点还要在于本层使用过的数字不能再使用
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var findSubsequences = function(nums) {
    const res = [];
    const path = [];
    const backtraversing = (nums, startIndex)=>{
        if (path.length>=2) {
            res.push([...path]);
        }
        if (startIndex>nums.length) {
            return;
        }
        const set = new Set();
        for (let i=startIndex;i<nums.length;i++) {

            let flag = !((nums[i] < path[path.length-1]) || set.has(nums[i]));
            if (flag) {
                set.add(nums[i]);
                path.push(nums[i]);
                backtraversing(nums, i+1);
                path.pop();
            }
            
        }
    }
    backtraversing(nums,0);
    return res;
};

46.全排列
本题重点感受一下,排列问题 与 组合问题,组合总和,子集问题的区别。 为什么排列问题不用 startIndex
https://programmercarl.com/0046.全排列.html
视频讲解:https://www.bilibili.com/video/BV19v4y1S79W

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
    const res = [];
    const path = [];
    const used = new Array(nums.length).fill(false);
    const backtraversing = (nums) => {
        if (path.length === nums.length) {
            res.push([...path]);
            return;
        }

        for (let i=0; i< nums.length;i++) {
            if (used[i]) {
                continue;
            }
            used[i]=true;
            path.push(nums[i]);
            backtraversing(nums);
            path.pop();
            used[i]=false;
        }
    }
    backtraversing(nums);
    return res;
};

47.全排列 II
本题 就是我们讲过的 40.组合总和II 去重逻辑 和 46.全排列 的结合,可以先自己做一下,然后重点看一下 文章中 我讲的拓展内容。 used[i - 1] == true 也行,used[i - 1] == false 也行
https://programmercarl.com/0047.全排列II.html
视频讲解:https://www.bilibili.com/video/BV1R84y1i7Tm

本层使用过的下一层不能使用,本层使用过的本层也不能再使用
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permuteUnique = function(nums) {
    nums.sort((a,b)=>a-b);
    const res = [];
    const path = [];
    const used = new Array(nums.length).fill(false);
    const backtraversing = (nums) => {
        if (path.length === nums.length) {
            res.push([...path]);
            return;
        }

        for (let i=0; i<nums.length; i++) {
            if (i > 0 && nums[i] === nums[i-1] && used[i-1] === false) {
                continue;
            }
            if (used[i] === false) {
                used[i] = true;
                path.push(nums[i]);
                backtraversing(nums);
                path.pop();
                used[i] = false;
            }
           
        }
    }
    backtraversing(nums);
    return res;
};

标签:排列,const,nums,46,随想录,return,length,used,path
From: https://www.cnblogs.com/yuanyf6/p/18234057

相关文章