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

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

时间:2024-07-18 15:20:23浏览次数:13  
标签:排列 nums 46 res self 随想录 len used path

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

491.递增子序列
https://leetcode.cn/problems/non-decreasing-subsequences/
代码随想录
https://programmercarl.com/0491.递增子序列.html#算法公开课
46.全排列
https://leetcode.cn/problems/permutations/description/
代码随想录
https://programmercarl.com/0046.全排列.html
47.全排列 II
https://leetcode.cn/problems/permutations-ii/description/
代码随想录
https://programmercarl.com/0047.全排列II.html#算法公开课

491.递增子序列

题解思路

  • 停止条件:
    • 个数大于2个 并不重复;
    • index到最后时;
  • 控制递增:在循环内控制下一个元素;
  • 剪枝:相同元素不遍历
  • 去重:
    • set去重

题解代码

class Solution:
    def __init__(self):
        self.res = []
        self.path = []
    def back_trace(self,nums,index):
        if len(self.path)>=2:
            self.res.append(self.path[:])

        if index==len(nums):
            return
        uset = set()
        for i in range(index,len(nums)):
            if (len(self.path)>0 and nums[i]<self.path[-1]) or nums[i] in uset:
                continue
            ## 保证本层不重复使用该元素
            uset.add(nums[i])
            self.path.append(nums[i])
            self.back_trace(nums,i+1)
            self.path.pop()


    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        if len(nums)==0:
            return self.res
        self.back_trace(nums,0)
        return self.res

46.全排列

题解思路

  • 排列和分组的区别:需要把所有元素用完;

题解代码

class Solution:
    def __init__(self):
        self.res = []
        self.path = []
    def back_trace(self,nums,used):
        if len(self.path)==len(nums):
            self.res.append(self.path[:])
            return
        for i in range(len(nums)):
            if used[i]==1:
                continue
            used[i] = 1
            self.path.append(nums[i])
            self.back_trace(nums,used)
            self.path.pop()
            used[i] = 0
    def permute(self, nums: List[int]) -> List[List[int]]:
        if len(nums)==0:
            return []
        self.back_trace(nums,[0]*len(nums))
        return self.res

47.全排列 II

题解思路

  • 元素重复可以 但是同一树枝不能重复取l used数组解决
class Solution:
    def __init__(self):
        self.res = []
        self.path = []
    def back_trace(self,nums,used):
        if len(self.path) == len(nums):
            self.res.append(self.path[:])
            return
        for i in range(len(nums)):
            if used[i]==1 or (i>0 and nums[i]==nums[i-1] and used[i-1]==0):
##1.一个数组中的数字不能重复取
##2.同一层数重复读取数字
                continue
            used[i]=1
            self.path.append(nums[i])
            self.back_trace(nums,used)
            self.path.pop()
            used[i]=0
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        if len(nums)==0:
            return self.res
        nums = sorted(nums)
        self.back_trace(nums,[0]*len(nums))
        return self.res

标签:排列,nums,46,res,self,随想录,len,used,path
From: https://www.cnblogs.com/P201821440041/p/18307876

相关文章

  • 代码随想录二刷复习(二分法)
    二分法模板:1:左闭右闭区间写法第一种写法,我们定义target是在一个在左闭右闭的区间里,也就是[left,right](这个很重要非常重要)。区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left,right]区间,所以有如下两点:while(left<=right)要使用<=,因为left==rig......
  • 题解:B3646 数列前缀和 3
    分析板子题,线段树维护矩阵区间积,除了难写没什么思维难度。所以直接放代码吧。Code#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;inlineintread(){ intx=0,f=1;charch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getcha......
  • 「代码随想录算法训练营」第十三天 | 二叉树 part3
    110.平衡二叉树题目链接:https://leetcode.cn/problems/balanced-binary-tree/题目难度:简单文章讲解:https://programmercarl.com/0110.平衡二叉树.html视频讲解:https://www.bilibili.com/video/BV1Ug411S7my题目状态:通过思路:采用递归的方式,遍历每个节点的左右孩子的深度......
  • NC275631 嘤嘤不想求异或喵,NC274492 76与61,NC273546 小红的数组移动
    目录NC275631嘤嘤不想求异或喵题目描述运行代码代码思路ff 函数解释:主函数解释:NC27449276与61题目描述运行代码代码思路函数 countSubsequences 的工作原理:举例说明:NC273546小红的数组移动题目描述运行代码代码思路嘤嘤不想求异或喵题目描述登录—专......
  • 代码随想录算法训练营第14天 | 复习二叉树翻转
    2024年7月17日递归法翻转二叉树易错:要考虑节点为空的情况,以及写好边界条件。/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*TreeNode(){}*TreeNode(intval){this.va......
  • 代码随想录算法训练营第26天 | 回溯02:39. 组合总和、40.组合总和II、131.分割回文串
    代码随想录算法训练营第26天|回溯02:39.组合总和、40.组合总和II、131.分割回文串组合总和https://leetcode.cn/problems/combination-sum/代码随想录https://programmercarl.com/0039.组合总和.html40.组合总和IIhttps://leetcode.cn/problems/combination-sum-ii/desc......
  • 代码随想录算法训练营第24天 |
    代码随想录算法训练营第24天|回溯基础理论、第77题.组合、216.组合总和III、回溯基础理论代码随想录https://programmercarl.com/回溯算法理论基础.html#题目分类第77题.组合https://leetcode.cn/problems/combinations/description/代码随想录https://programmercarl.c......
  • 代码随想录之哈希表
    1、有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。示例1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:......
  • 代码随想录刷题Day 14 二叉树part02
    226.翻转二叉树//这道题其实就是遍历二叉树,然后交换每个节点的左右子节点即可。这里我就使用了一个栈来存储需要遍历的节点,每次循环弹出一个,然后交换其左右子节点就好了classSolution{publicTreeNodeinvertTree(TreeNoderoot){Stack<TreeNode>stack=new......
  • 代码随想录day27 递增子序列 | 全排列 | 全排列 II
    递增子序列递增子序列解题思路用set来去重,之后每次一个节点存入时与前一个节点进行大小比较,如果小就不存了,跳过剩余的回溯过程知识点回溯,去重心得在考虑去重的时候忘记了使用C++的数据结构set,得记下这个方法全排列全排列解题思路在回溯迭代的时候传入了一个统计数组元......