当前位置: 首页 > news >正文

代码随想录算法训练营第七天|组合、组合总和III和电话号码的字母组合

组合

【题目简介】

【回溯解法】

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        # 回溯算法
        startIndex = 1
        self.path = []
        self.result = []
        self.traversal(n, k, startIndex)
        return self.result

    def traversal(self, n, k, startIndex):
        if len(self.path) == k:
            self.result.append(self.path[:])  # 这里需要加上[:]!
            return               # 至此之后,没有必要再向后遍历了!
                                 # 这里是从深度上进行剪枝!
        need_num = k - len(self.path)
        for i in range(startIndex, n + 1):  # 从广度上进行剪枝
            rest_num = n - i + 1
            if (rest_num < need_num): break
            # 当还需要的项目数大于序列剩余的项目时,则终止
            self.path.append(i)
            self.traversal(n, k, i + 1)
            self.path.pop()

  1. 在这里path和result我习惯上使用全局变量
  2. 剪枝的方面:深度方向剪枝,以及广度方向的剪枝!

组合总和III

【题目简介】

【回溯解法】

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        self.path = []
        self.result = []
        self.backtracking(n, k, 1)

        return self.result


    def backtracking(self, n, k, startIndex):
        if sum(self.path) == n and len(self.path) == k:
            self.result.append(self.path[:])
            return                     # 终止条件 兼 深度剪枝
        if sum(self.path) > n: return  # 深度剪枝


        #? startIndex的作用是啥? 避免重复的组合!控制当前递归层次的递归元素范围
        for i in range(startIndex, 10): 
            need_num = k - len(self.path)
            rest_num = 10 - i + 1
            if rest_num < need_num: break  # 广度剪枝

            self.path.append(i)
            self.backtracking(n, k, i + 1)
            self.path.pop()
  1. 这类题最为关键的就是明白startIndex的作用(元素不允许重复出现!且组合不会重复出现 🌟好好悟 🌟)!以及各类剪枝的位置;
  2. 明确深度剪枝要执行的位置!明确广度剪枝要执行的位置!

电话号码的字母组合

【题目简介】

【回溯解法】

class Solution:
    def letterCombinations(self, digits: str) -> List[str]:
        # 回溯解法
        # 如果已知2和3的字符组合,进行双for循环的自由组合即可
        # 如何根据数字字符获取到对应的字母字符串?或者存储结构?
        
        self.intchar_strchars = [
            "",
            "",
            "abc",
            'def',
            "ghi",
            "jkl",
            "mno",
            "pqrs",
            "tuv",
            "wxyz"
        ]

        if len(digits) == 0: return []

        self.digits = list(digits)
        # 被遍历的元素来自于多个集合!!!起始不同迭代层次的元素范围不同

        self.path = []
        self.result = []
        self.backtracking(len(self.digits), 0)
        return self.result

    def backtracking(self, k, deep):
        if len(self.path) == k:
            self.result.append("".join(self.path[:]))
            return

        digit = self.digits[deep]
        for i in self.intchar_strchars[int(digit)]:
            self.path.append(i)
            self.backtracking(k, startIndex + 1)
            self.path.pop()
```

1. 除了本题中的跟题目应用相关的相关结构体的构建,比如数字和对应字符串对应关系的存储结构;其他的就是每一个数字对应的字符串集合就是每层迭代深度下的for循环遍历集合!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/72187.html

相关文章:

  • 基于cat1的贵重物品的状态和位置小型监控系统特色解析
  • 第十五届蓝桥杯C/C++B组拔河问题详解
  • OrioleDB: 新一代PostgreSQL存储引擎
  • stl之string的详解
  • 基于云的内容中台驱动企业智能服务升级
  • 并发编程--具名管道
  • HarmonyOS-应用程序框架基础
  • 应用于电池模块的 Fluent 共轭传热耦合
  • 【源码分析】Nacos服务注册源码分析-客户端
  • 解决load()文件报错zipfile.BadZipFile: File is not a zip file
  • 给easygui添加字体设置功能(tyysoft增强版)
  • WEB UI自动化测试中,元素定位的八大定位方式详解
  • 事务与异步方法(@Async)协同工作
  • python中print函数的flush如何使用
  • 什么是状态管理?有何种方式可以实现?它们之间有什么区别?
  • ChatGPT-4
  • MyBatis操纵数据库-XML实现(补充)
  • C语言指针与数组深度解析
  • 【ASMbits--常用算术运算指令】
  • 《从零手写Linux Shell:详解进程控制、环境变量与内建命令实现 --- 持续更新》
  • 掌握Windows命令提示符中的万能符:*号的全方位使用指南
  • 2.2[frontEnd]ESLint
  • 语音识别 FireRedASR-AED模型主要特点
  • Gitee重新远程连接仓库(Linux)
  • Spring boot+mybatis的批量删除
  • 模运算的艺术:从基础到高阶的算法竞赛应用
  • AI大白话(一):5分钟了解AI到底是什么?
  • 知识图谱流程说明
  • 开源通义万相本地部署方案,文生视频、图生视频、视频生成大模型,支持消费级显卡!
  • DAY34 贪心算法Ⅲ