首页 > 编程语言 >代码随想录算法训练营第二十五天| leetcode491.递增子序列、leetcode46.全排列、leetcode47.全排列 II

代码随想录算法训练营第二十五天| leetcode491.递增子序列、leetcode46.全排列、leetcode47.全排列 II

时间:2024-11-13 16:58:48浏览次数:1  
标签:排列 nums self 随想录 len used result path leetcode46

1 leetcode491.递增子序列

题目链接:491. 非递减子序列 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili

思路:用之前的方法,结果翻车了,好好看视频学新技能吧

1.1 视频后的思路

真的没想到用set来去重,还是基本功不够扎实呀

class Solution:
    def __init__(self):
        self.result = []
        self.num = []
    
    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        self.backtracking(nums,0)
        return self.result
    
    def backtracking(self,nums,startindex):
        if len(self.num[:])>1:
            self.result.append(self.num[:])
        if startindex == len(nums):
            return
        unset = set()
        for i in range(startindex,len(nums)):
            if (self.num and nums[i]<self.num[-1]) or nums[i] in unset:
                continue
            unset.add(nums[i])
            self.num.append(nums[i])
            self.backtracking(nums,i+1)
            self.num.pop()

1.2 本题小结

  1. 针对去重的问题,其实感觉自己做的不够多,就会忘了如何去删除重读元素,看来还是多练习多去写呀
  2. 真的set函数,前面学后面忘

2 leetcode46.全排列

题目链接:46. 全排列 - 力扣(LeetCode)

文章链接:代码随想录

视频链接:组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列_哔哩哔哩_bilibili

思路:新问题,真不错,不过我写不出来,看来还是前面的方法掌握的不够熟练,其实是用used的方法解决的就行了,,,

2.1 视频后的思路

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

2.2 本题小结

  1. 这道题与之前的题目区别就在于需要重复的,嗯,写的时候就发现其实就很简单,看完视频就会了

3 leetcode47.全排列 II

题目链接:47. 全排列 II - 力扣(LeetCode)

文章链接:代码随想录

视频链接:回溯算法求解全排列,如何去重?| LeetCode:47.全排列 II_哔哩哔哩_bilibili

思路:上一题写完,结合之前的那道题的思路,Duang这个答案就写出来啦

3.1自己的思路

真就融汇贯通啦,自己结合之前的方法就水灵灵的写出来咯

class Solution:
    def __init__(self):
        self.result = []
        self.path = []
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        used = [False]*len(nums)
        self.backtracking(nums,used)
        return self.result
    def backtracking(self,nums,used):
        if len(self.path[:])==len(nums):
            self.result.append(self.path[:])
            return
        unset =set()
        for i in range(len(nums)):
            if used[i]==True or nums[i] in unset:
                continue
            unset.add(nums[i])
            used[i] = True
            self.path.append(nums[i])
            self.backtracking(nums,used)
            self.path.pop()
            used[i]=False

3.2 视频后的方法

就是使用了排列的方法,感觉两者差不多

class Solution:
    def __init__(self):
        self.result = []
        self.path = []
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        used = [False]*len(nums)
        self.backtracking(nums,used)
        return self.result
    def backtracking(self,nums,used):
        if len(self.path[:])==len(nums):
            self.result.append(self.path[:])
            return
        for i in range(len(nums)):
            if (i>0 and nums[i]==nums[i-1] and used[i-1]==False) or used[i]:
                continue
            used[i] = True
            self.path.append(nums[i])
            self.backtracking(nums,used)
            self.path.pop()
            used[i]=False

3.3 本题小结

  1. 哈哈哈哈哈哈,真就是融汇贯通的一道题目,嗯,算是弄懂了吧

4 今日小结

  1. 知识的融合其实有待加强,首先式针对第一题,就是不知道如何防止重复,感觉已经忘记了如何使用集合,但是看了以后就觉得,确实有点不太融汇的感觉
  2. 对于二的题目,其实就是判断的逻辑真的没想到,使用一个列表来计算,但是看了就觉得自己能立刻写出来
  3. 对于三就是之前知识融合而已,终于,回溯也结束啦

标签:排列,nums,self,随想录,len,used,result,path,leetcode46
From: https://www.cnblogs.com/csfy0524/p/18544335

相关文章

  • 代码随想录算法训练营 | 所有可达路径
    所有可达路径文章链接:https://programmercarl.com/kamacoder/0098.所有可达路径.html#本题代码题目链接:https://kamacoder.com/problempage.php?pid=1170#include<iostream>#include<vector>usingnamespacestd;//全局路径vector<vector<int>>paths;vector<in......
  • 代码随想录算法训练营第二十四天| leetcode93.复原IP地址、 leetcode78.子集、leetcod
    1leetcode93.复原IP地址题目链接:93.复原IP地址-力扣(LeetCode)文章链接:代码随想录视频链接:回溯算法如何分割字符串并判断是合法IP?|LeetCode:93.复原IP地址_哔哩哔哩_bilibili思路:就是将这个字符串符合要求的进行一个收集,然后使用列表存储,最后使用join函数将这个列表进行连......
  • 代码随想录——二叉树17-路径总和
    这两道题目对于递归函数的返回值是不同的,这里进行总结,二叉树遍历中递归函数返回值何时有何时没有。这里总结如下三点:如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。(这种情况就是路径总和ii)如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需......
  • 代码随想录算法训练营第二十三天| leetcode39. 组合总和、leetcode40.组合总和II、lee
    1leetcode39.组合总和题目链接:39.组合总和-力扣(LeetCode)文章链接:代码随想录视频链接:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)|回溯法精讲!_哔哩哔哩_bilibili思路:跟之前差不多,就是将他的循环改一下,但是我发现有重复的数值了,不知道如何删除1.1自......
  • 代码随想录算法训练营第十一天|LeetCode150.逆波兰表达式求值、239.滑动窗口最大值、3
    前言打卡代码随想录算法训练营第49期第十一天 φ(゜▽゜*)♪首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今日题目在学......
  • 代码随想录 -- 动态规划 -- 完全背包理论基础
    52.携带研究材料(第七期模拟笔试)思路:dp[j]的含义:装满容量为j的背包时,背包的最大价值为dp[j].递推公式:当j>=weight[i]时:dp[j]=max(dp[j],dp[j-weight[i]]+value[i])初始化:全部初始化为0遍历顺序:先遍历物品和先遍历背包都可以,都是从前往后遍历(因为物品可以重复使用)。n,......
  • 代码随想录第八天|字符串part01--344.反转字符串、541.反转字符串Ⅱ、卡玛网54.替换数
    资源引用:leetcode题目:344.反转字符串(344.反转字符串-力扣(LeetCode))541.反转字符串Ⅱ(541.反转字符串II-力扣(LeetCode))卡玛网题目:卡玛网54.替换数字(54.替换数字(第八期模拟笔试)(kamacoder.com))碎碎念回归:本来应该11月6号打卡的,因为接连4天的考试+多个竞赛,导致推迟......
  • 代码随想录算法训练营第三天(LeetCode203.移除链表元素;LeetCode707.设计链表;LeetCode20
    LeetCode203.移除链表元素题目链接:LeetCode203.移除链表元素题目链接思路这道题目主要考察的是移除一个链表当中的元素,我们可以先在给定的链表前面加一个虚拟头结点,这样我们对给定链表头结点的操作和给定链表其余结点的操作就会变得相同。代码classSolution{p......
  • 代码随想录算法训练营第四天(LeetCode24.两两交换链表中的节点;LeetCode10.删除链表的倒
    LeetCode24.两两交换链表中的节点题目链接:两两交换链表中的节点题目链接思路这道题其实就是一个模拟题,要求每次交换链表中两个相邻的节点(1、2节点互换;3、4节点互换;2、3节点不互换,意思就是交换过的节点不参与后续的交换了),同时只能进行节点交换,不能进行值交换。主要考......
  • 代码随想录算法训练营第二十二天| leetcode77. 组合、leetcode216.组合总和III、leetc
    1leetcode77.组合题目链接:77.组合-力扣(LeetCode)文章链接:代码随想录视频链接:带你学透回溯算法-组合问题(对应力扣题目:77.组合)|回溯法精讲!_哔哩哔哩_bilibili思路:开始想循环,感觉行不通,然后看了视频,就嗯理解了一些感觉跟递归的思路确实差不多1.1回溯三部曲回溯的方法首......