首页 > 编程语言 >代码随想录算法训练营第24天 |

代码随想录算法训练营第24天 |

时间:2024-07-17 10:57:43浏览次数:8  
标签:24 index return res 训练营 随想录 len path self

代码随想录算法训练营第24天 |回溯基础理论、第77题. 组合、216.组合总和III、

回溯基础理论代码随想录
https://programmercarl.com/回溯算法理论基础.html#题目分类
第77题. 组合
https://leetcode.cn/problems/combinations/description/
代码随想录
https://programmercarl.com/0077.组合.html#算法公开课
第77题. 组合
https://leetcode.cn/problems/combinations/description/
代码随想录
https://programmercarl.com/0077.组合.html
17.电话号码的字母组合
https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/
代码随想录
https://programmercarl.com/0017.电话号码的字母组合.html#算法公开课

回溯搜索法 — 纯暴力搜索法

分类

  1. 组合
  2. 切割:回文子串
  3. 子集问题 1234的子集
  4. 排列问题:有顺序的组合
  5. 棋盘问题

解决方式

抽象成树形结构递归(N叉树)

回溯法模版

while backtrack():
	if (终止条件):
		收集结果;
		return
	for 节点 in (集合元素集)##:
		处理节点;
		递归函数;
		回溯操作;
  1. 确定函数的参数;
  2. 确定终止条件;
  3. 确定单层搜索逻辑;

第77题. 组合

题解思路

  • 参数:startindex(每次循环不断增加的值),res(最终结果),path(当前值)
  • 剪枝:for i in range(start_index,n-(k-len(path))+1)
    • n-(k-len(path)):n可搜索空间;k-len(path)已经搜索过的空间;+1(除去startindex)

题解代码——优化后

class Solution:
    def back_track(self, n, k, start_index, res, path):
        if len(path)==k:
            res.append(path[:])
            return
        
        for i in range(start_index,n-(k-len(path))+2):
            path.append(i)
            self.back_track(n,k,i+1,res,path)
            path.pop()
            
    def combine(self, n: int, k: int) -> List[List[int]]:
        res = []
        path = []
        self.back_track(n,k,1,res,path)
        return res

216.组合总和III

题解思路:

  • 和上题一样 换成计算和而已
  • 停止条件和优化也有变化

题解代码

class Solution:
    def back_track(self,k,n,index,res,path):
        if len(path)==k  and sum(path)==n:
            res.append(path[:])
            return
        for i in range(index,9-(k-len(path))+2):
            if sum(path)+i<=n:
                path.append(i)
                self.back_track(k,n,i+1,res,path)
                path.pop()
            else:
                break
                return

    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        res = []
        self.back_track(k,n,1,res,[])
        return res

17.电话号码的字母组合

题解思路

  • 直接换index就可以解决循环嵌套问题 不需要循环两遍;

题解代码

class Solution:
    def __init__(self):
        self.map_ = {
            '2':['a','b','c'],
            '3':['d','e','f'],
            '4':['g','h','i'],
            '5':['j','k','l'],
            '6':['m','n','o'],
            '7':['p','q','r','s'],
            '8':['t','u','v'],
            '9':['w','x','y','z']
        }
        self.res = []
        self.str = ""
    
    def back_trace(self,digits,index):
        if index==len(digits):
            self.res.append(self.str)
            return
        
        for i in self.map_[digits[index]]:#遍历每个字符串
            self.str = self.str + i
            self.back_trace(digits,index+1)#遍历每个按钮
            self.str = self.str[:-1]

    def letterCombinations(self, digits: str) -> List[str]:
        if len(digits)==0:
            return self.res
        self.back_trace(digits,0)
        return self.res

标签:24,index,return,res,训练营,随想录,len,path,self
From: https://www.cnblogs.com/P201821440041/p/18305824

相关文章

  • 2024年睿抗机器人开发者大赛(RAICOM)CAIP-编程技能赛-本科组省赛
    本人分数:10+15+17+1+30=73 九百多名次,等公布得奖结果之后再贴出来代码情况:前二十分钟进不去,炸掉了,官方补时20minRC-u1热҈热҈热҈ 分数10热҈热҈热҈……最近热得打的字都出汗了!幸好某连锁餐厅开启了气温大于等于35度即可获得一杯免费雪碧的活动。但不知为何,在......
  • EmEditor v24.2.1 汉化版
    EmEditor文本编辑器是一款功能强大且非常好用的文本编辑器!它启动速度快,可以完全代替Windows自带的记事本,足以胜任日常的文本编辑工作。良好地支持Unicode和中文字符,还支持20多种编程语言的语法突出显示。并且支持的语法种类可以不断的扩充。具有选择文本列块的功能(按ALT键拖动鼠......
  • 闲话 24.7.17
    闲话不是,绝区零真好玩吧?质疑艾莲,理解艾莲,单推艾莲/se从图书馆借了本陶哲轩实分析(预告:处理▂▕▄▄制▒▟▀问题可以▙依赖[错误:所引对象未导引至对象实例;标准处理方法_003.rtf不存在]。不确定能否[已编辑]。推歌:未名星河by蛾君etal.feat.洛天依奇思妙想:一阶常......
  • 2024牛客暑期多校训练营1 I.Mirror Maze(题解)
    题意给一个\(n\timesm\)的二维char数组,由4种镜子组成,'\','/','-','|',镜面反射规则就是根据光线的方向和镜面的角度符合直觉的反射,然后有多组询问\(q\leq10^6\),每次给定起始位置和光线方向,求该光会经过多少面不同的镜子的反射。思路首先根据数据范围,发现肯定需要预处......
  • 【App渗透】BurpSuite插件-Brida 2024最新自动加解密Custom plugins演示
    文章目录前言一、测试app的客户端和服务端二、BurpSuite设置代理三、反编译apk文件四、编写brida/fridahook脚本五、Customplugins自动加解密六、本期送书《二进制安全基础》如何领书总结前言之前有写过如何安装brida的文章和视频讲解,大家感兴趣的可以看看之前......
  • 2024年华为OD机试真题-符号运算-(C++/Java/python)-OD统一考试(C卷D卷)
      2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】    题目描述给定一个表达式,求其分数计算结果。表达式的限制如下:所有的输入数字皆为正整数(包括0)仅支持四则运算(+-*,/)和括号结果为整数或分数,分数必须化为最简格式(比如6,3/4,7/8,90/7)除数可能为0,如果遇到......
  • 代码随想录之哈希表
    1、有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。示例1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:......
  • 题解|2024暑期牛客多校01
    【原文链接】太菜了就先挂4题,其他的写出来了再回来补QwQA.ABitCommon组合数学题目大意题目概括:给定两个整数nnn和m......
  • 2024年春季新番简评
    2024年春季新番简评四月:春天,春天与恋爱、美好等常常联系在一起。四月新番通常也是一年之中优秀动画最多的一个季度。2024年的春天,是一个原创动画和续作动画充满话题度的春天。忙完了期末考和期末实验,终于有机会来写新番记录了,这个学期真的有点心力憔悴,选了三门专选课,但是感觉又......
  • 代码随想录刷题Day 14 二叉树part02
    226.翻转二叉树//这道题其实就是遍历二叉树,然后交换每个节点的左右子节点即可。这里我就使用了一个栈来存储需要遍历的节点,每次循环弹出一个,然后交换其左右子节点就好了classSolution{publicTreeNodeinvertTree(TreeNoderoot){Stack<TreeNode>stack=new......