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

代码随想录算法训练营day25| 491.递增子序列 46.全排列 47.全排列2

时间:2024-10-24 21:42:14浏览次数:5  
标签:排列 nums day25 self 随想录 len used result path

学习资料:https://programmercarl.com/0491.递增子序列.html#算法公开课

排列与组合的区别,不用startIndex,而每个树层都从0开始,但是要跳过已经用过的数(用used判断)

学习记录:
491.递增子序列(添加一个数组used(hash表),来保持数组每个位置上的数的使用情况,没用过为0,用过变成1)

点击查看代码
class Solution(object):
    def backtracking(self, nums, startIndex, path, result):
        # 与前面子集问题不同,这里只取有两个及以上元素的节点;还是不用考虑终止条件
        if len(path) > 1:
            result.append(path[:])
        
        # 关键:用数组来表示hash表,用于去重,每次用过的数字作为键对应的值都从0变成1,所以根据值就可以判断是否使用过。
        # 一位内数组元素的值在-100到100之间,不大,可用数组,但是因为键是从0开始增加,所以-100的要加100转换为0开始。
        used_ls = [0]*201
        for i in range(startIndex, len(nums)):
            # 去重:1加入的新元素小于已有元素,2这个新元素的值用过了
            if (path and nums[i]<path[-1]) or used_ls[nums[i]+100] == 1:
                continue
            used_ls[nums[i]+100] = 1  # 用hash及时更新元素使用状态
            path.append(nums[i])
            self.backtracking(nums, i+1, path, result)  # 不能重复用同一个元素,i+1
            path.pop()

    def findSubsequences(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        result = []
        self.backtracking(nums, 0, [], result)
        return result
        

46.全排列(收集叶子节点)

点击查看代码
class Solution(object):
    def backtracking(self, nums, used_ls, path, result):
        # 只收集叶子节点
        if len(path) == len(nums):
            result.append(path[:])
            return
        # 排列时,每次都考虑所有值,而非startIndex开始,但是不包括已经用过的,去重就用数组
        for i in range(len(nums)):
            if used_ls[i]:
                continue
            used_ls[i] = 1
            path.append(nums[i])
            self.backtracking(nums, used_ls, path, result)
            path.pop()       # 回溯
            used_ls[i] = 0   # 回溯

    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        result = []
        used_ls = [0]*len(nums)
        self.backtracking(nums, used_ls, [], result)
        return result
        

47.全排列2(去重,同一树层选取的数的值应该不同,还是数组排序再前后值比大小)

点击查看代码
class Solution(object):
    def backtracking(self, nums, used, path, result):
        if len(path) == len(nums):
            result.append(path[:])
            return
        for i in range(len(nums)):
            if i>0 and nums[i] == nums[i-1] and used[i-1]==0:  # 树层去重:在保证在判断树层的基础上,确定本次使用的树与上一次不同 (usd[i-1]代表是同一层,而非同一数枝!!!!!!)
                continue
            if used[i]==1:  # 保证这个数没被用过,用used位置判断
                continue
            # 开始递归
            used[i] = 1
            path.append(nums[i])
            self.backtracking(nums, used, path, result)
            # 回溯
            path.pop()
            used[i] = 0
            

    def permuteUnique(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()           # 给数组排序,用于后续的树层去重
        used = [0]*len(nums)    # used是用来确定该位置的数有没有被用过
        result = []
        self.backtracking(nums, used, [], result)
        return result

        

PS:又是心碎的一天,阴转小雨,今天又笔试了一场,能感觉到难度不大都是基础知识,但是非科班的弊端就来了,都不知道。编程题也不会写,能感觉到一点点思路可能就是回溯法,但是感觉火候还不到,还是写不出来。
先学3道题吧,重新安排行程,N皇后,解数独明天再来,累咯
感觉还是别报人工智能岗了,水平不到。
今天吃了好吃的蛋挞,奶味很浓郁,就是一个就好,将将好被腻到

标签:排列,nums,day25,self,随想录,len,used,result,path
From: https://www.cnblogs.com/tristan241001/p/18501405

相关文章

  • 代码随想录算法训练营第24天(补第12天)| 递归遍历,迭代遍历,统一迭代
    前置知识二叉树的定义:structBNode{intval;BNode*lchild;BNode*rchild;BNode():lchild(NULL),rchild(NULL){}BNode(intval){val=val;lchild=rchild=NULL;}};递归遍历文章链接:https://programmercarl.com/二叉树的递归遍历.html#思路题目......
  • 树形限制的排列生成dp
    对于这类树形限制的生成排列的题记录两种不同的做法\(\color{blue}\textbf{[例题]}\)第一种方法(暴暴暴暴暴力dp)P4099[HEOI2013]SAOP3757[CQOI2017]老C的键盘第二种方法(容斥+dp)P5405[CTS2019]氪金手游题面生成一个大小为n的排列,满足n-1条形如p[x]>p[y]......
  • 代码随想录算法训练营第九天|leetcode151.翻转字符串里的单词、卡码网55.右旋字符串
    1leetcode151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)文章链接:代码随想录视频链接:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili自己的思路:直接将空格去掉,然后分割字符串为列表,在列表中进行翻转,不在字符串内部操作,......
  • 代码随想录算法训练营第二十四天|Day24 回溯算法
    93.复原IP地址题目链接/文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html视频讲解:https://www.bilibili.com/video/BV1XP4y1U73i/思路char**result;intresultTop;intsegments[3];intisValid(char*s,intstart,intend){......
  • 排列组合问题之圆形分布
    1、问题1.1团团坐有一张圆桌,坐了A,B,C,D四个人,已知,D在A的右边,C在D的对面,请问A,B,C,D,的坐次?解答:这个问题相对简单,我们纸上画一画,就能画出他们的可能的位置了但是,可能还有一种解,比如我们把A,B,C,D依次右转一个位,也是满足条件的,而且只要保持他们的相对位置不变,依次右转n个......
  • 排列组合之线性排列
    1、问题1.1袋中取球袋子里有4个球,分别编号为{1,2,3,4},依次取出,按照取出的先后从左至右排列,会得到一个不同的数字(如1234,有点像双色球开奖),求输出所有的数字组合。1.2不重复的数有4个数字{0,1,2,3},问用这4个数字能组成多少种不能的4位数(0123也算,因为我们也可......
  • 代码随想录算法训练营 | 岛屿数量 深搜,岛屿数量 广搜,岛屿的最大面积
    岛屿数量深搜题目链接:岛屿数量深搜文档讲解︰代码随想录(programmercarl.com)日期:2024-10-23想法:Java代码如下:importjava.util.Scanner;publicclassMain{publicstaticint[][]dir={{0,1},{1,0},{-1,0},{0,-1}};publicstaticvoiddfs(boolean[][]v......
  • 【代码随想录Day50】图论Part02
    岛屿数量深搜题目链接/文章讲解:代码随想录classSolution{//计算网格中岛屿的数量publicintnumIslands(char[][]grid){intsum=0;//初始化岛屿数量为0//遍历整个网格for(inti=0;i<grid.length;i++){......
  • 代码随想录第七天
    454.四数相加II给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4=[0,......
  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录二叉树理论基础学习二叉树有两种主要的形式:满二叉树和完全二叉树。满二叉树:只有度为0的结点和度为2的结点,且度为0的结点在同一层的二叉树。深度为k,有2^k-1个节点。完全二叉树:除了最......