首页 > 编程语言 >Day24 第七章 回溯算法part03

Day24 第七章 回溯算法part03

时间:2024-08-09 18:05:58浏览次数:11  
标签:nums Day24 part03 dfs start 回溯 path self def

目录

任务

78.子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的
子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

思路

和组合问题类似,思路是从序列中每次选一个,选的深度为递归,选的可能性为循环。只不过组合是在叶子节点收集信息,而子集是在每个节点都收集信息。

class Solution:
    def __init__(self):
        self.path = []
        self.paths = []
    def subsets(self, nums: List[int]) -> List[List[int]]:
        self.dfs(nums,0)
        return self.paths

    def dfs(self,nums,start):
        self.paths.append(self.path[:])
        
        # if start == len(nums): return
        for i in range(start,len(nums)): 
            
            self.path.append(nums[i])
            self.dfs(nums,i+1)
            self.path.pop()

90. 子集 II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的
子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

思路

类似组合总和II,需要做横向剪枝的操作以达到去重的目的。

class Solution:
    def __init__(self) -> None:
        self.path = []
        self.paths = []
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        self.dfs(nums,0)
        return self.paths
    def dfs(self,nums,start):
        self.paths.append(self.path[:])
        
        
        for i in range(start,len(nums)): 
            if i > start and nums[i] == nums[i-1]:
                continue
            self.path.append(nums[i])
            self.dfs(nums,i+1)
            self.path.pop()

93. 复原 IP 地址

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

思路

对于某次分割,注意分割区间,这道题后面需要重新做

class Solution:
    def __init__(self) -> None:
        self.path = []
        self.paths = []
    def restoreIpAddresses(self, s: str) -> List[str]:
        self.dfs(s,0)
        return self.paths
    def dfs(self,s,start):
        if start == len(s) and len(self.path) == 4:
            self.paths.append('.'.join(self.path))
            return 
        
        for i in range(start,min(start+3,len(s))): 
            if self.isValid(s,start,i+1):
                sub = s[start:i+1]
                self.path.append(sub)
                self.dfs(s,i+1)
                self.path.pop()
    def isValid(self,s,start,end):
        if start >= end: return False
        if start != end-1 and s[start] == '0':
            return False
        num = int(s[start:end])
        return 0 <= num <=255

心得体会

周末会针对回溯问题写个总结,如coding前怎么思考,coding后怎么分析等,目前对于分割问题掌握的不够,特别是分割区间,后续还需要打印分析下。

标签:nums,Day24,part03,dfs,start,回溯,path,self,def
From: https://www.cnblogs.com/haohaoscnblogs/p/18351245

相关文章

  • Day23 第七章 回溯算法part02
    目录任务39.组合总和思路40.组合总和II思路131.分割回文串思路心得体会任务39.组合总和给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些......
  • 回溯的简单辅助讲解
    回溯策略我个人其实把回溯看做递归的一个应用,回溯简单来讲就是用递归的方式深度遍历所有的可能,而在某些可能是一个解的时候,就记录,这目前看来和回溯两个字没啥关系,问题就在于,回溯可以解决一些需要我们回退元素并继续尝试的问题。刚才的概念里包含了两个关键词:“回退”,“尝试”。......
  • 代码随想录day24 || 93 复原IP地址,78 子集, 90 子集2
    93复原ip地址funcrestoreIpAddresses(sstring)[]string{ //字符串分割问题,考虑回溯算法 varpath,res[]string iflen(s)<4{ returnres } backtracking(s,&path,&res) returnres}funcbacktracking(sstring,path*[]string,res*[]string){ ifle......
  • Python回溯算法
    回溯算法回溯算法是一种系统的搜索算法,用于解决诸如排列组合、子集生成、图的路径、棋盘问题等问题。其核心思想是通过递归尝试各种可能的解决方案,遇到不满足条件的解时则回退(回溯),继续尝试其他可能性,直到找到所有的解决方案或确认无解。主要步骤:选择路径:在当前步骤选择一个可......
  • C++回溯算法经典例题:四皇后问题
    问题简介:在一个4×4的棋盘上,任意两个皇后都不能处在同一行、同一列任意两个皇后都不能处在同一斜线上(主斜线、反斜线)。题目分析:1.假设第一个皇后在(1,1):    1)在x=3时会卡死            2)在x=4时会卡死        2.假设第一个皇后在(2,1): ......
  • DAY 15 二叉树part03
      110.平衡二叉树(优先掌握递归)题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html 独立完成,感觉还比较好理解12classSolution{13public:14boolisBalanced(TreeNode*root){15if(......
  • Day 29 贪心算法 Part03
    今天的题目真是给我做恶心了134.加油站暴力方法很容易写出来,但在力扣上运行会超时。classSolution{int[]gas;int[]cost;publicintcanCompleteCircuit(int[]gas,int[]cost){this.gas=gas;this.cost=cost;for(inti=......
  • Day15 二叉树Part2 初见回溯(二叉树相关)
    任务110.平衡二叉树给定一个二叉树,判断它是否是平衡二叉树思路典型的树形DP,每个节点向它的左右孩子收集信息,然后利用收集到的信息判断当前节点,最后再将信息传给上层。对于本题,每个节点要判断以自己为根的树是否是平衡二叉树,需要判断3个条件:自己的左子树是否平衡自己的右子......
  • 三招解锁TNAS便捷访问,一键回溯奥运风采
    巴黎奥运会正火热进行中说起奥运相信很多人都会涌起对08年北京奥运会的无尽回忆那一年,我们怀揣着满腔热情想方设法奔赴北京争相购买可爱的福娃大街小巷回荡着《北京欢迎你》而那届开幕式的壮观景象更是“前无古人,后无来者”场面浩大雄伟气势恢宏高朋满座座无虚席 ......
  • APP逆向 day24unidbg上
    一.前言今天开始讲app逆向最后一个也是最重要的unidbg,这已经是从初级进阶到中级的了,我会讲unidbg,讲三节课,分为上中下来和大家讲(由简单到难逐步),这节课主要是和大家讲unidbg的介绍并且会结合之前讲的简单案例来让大家理解,如果过程中不太记得之前的位置定位,可以去看之前的课程,在......