代码随想录day22 || 77 组合,216 组合总和,17 电话号码字母组合

news/2024/11/20 0:35:27/文章来源:https://www.cnblogs.com/zhougongjin55/p/18346890

回溯问题

  • 回溯通常用来解决这些问题
    组合问题:N个数里面按一定规则找出k个数的集合
    切割问题:一个字符串按一定规则有几种切割方式
    子集问题:一个N个数的集合里有多少符合条件的子集
    排列问题:N个数按一定规则全排列,有几种排列方式
    棋盘问题:N皇后,解数独等等

image

  • 回溯的通用模板
    func backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}return
    }// for 循环用来遍历树的同一层级,递归用来遍历树的纵向深度
    

77组合

func combine(n int, k int) [][]int {// 回溯加剪枝var path = []int{}var res = [][]int{}backtracking(n, k, 1, &path, &res)return res
}func backtracking(n, k, startidx int, path *[]int, res *[][]int) {if len(*path) == k {newpath := make([]int, len(*path))  // !!!易错点,此处必须要将path重新赋值给新的变量,不然直接*res = append(*res, *path) 这样传递的是path的引用,导致最终所有结果都一样copy(newpath, *path)*res = append(*res, newpath)return}// 剪枝if n-startidx+1 < k - len(*path) {  // 易错点2,剪枝操作,如果剩余元素小于目标长度减去路径列表已有长度才剪枝,而不是直接判断index 与 k的关系return}for i:=startidx; i<=n; i++ {*path = append(*path, i) // 添加元素backtracking(n, k, i+1, path, res)*path = (*path)[:len(*path) - 1]  // 回溯删除上面添加的元素}return
}

216 排列之和

//leetcode submit region begin(Prohibit modification and deletion)
func combinationSum3(k int, n int) [][]int {// 思路组合问题另一种变体,返回值res用来存放和满足条件的结果即可var path = []int{}var res = [][]int{}backtracking(k, n, 1, &path, &res)return res
}func backtracking(k, n, startidx int, path *[]int, res *[][]int) {length := len(*path)if sum(*path) == n && length == k{var copypath = make([]int, length)copy(copypath, *path)*res = append(*res, copypath)return}// 剪枝操作,如果当前剩余数组长度小于目标长度减去已有长度,剪枝if 9 - startidx + 1 < k - length {return}// 剪枝2,最小和、大于目标和if minsum(k) > n {return}// 回溯递归for i:=startidx; i<=9; i++{*path = append(*path, i)backtracking(k, n, i+1, path, res)*path = (*path)[0 : len(*path) - 1]}return
}func sum(li []int) int {var sum intfor _, i := range li {sum += i}return sum
}func minsum (k int) int {// 返回1-9 k个数最小和var sum intfor i:=1; i<=k; i++{sum += i}return sum
}

17 电话号码对应字母组合

func letterCombinations(digits string) []string {if len(digits) == 0 {return nil}var path = []string{}var res = []string{}backtracking(0, digits, &path, &res)return res
}func backtracking(stridx int, k string, path *[]string, res *[]string){if len(*path) == len(k) {str := strings.Join(*path, "")*res = append(*res, str)return}// 剪枝情况, 结果集要的是全部情况,应该不能剪枝key, _ := strconv.Atoi(string(k[stridx]))for _, v := range digmap[key] {  // var v rune == var v []int32*path = append(*path, string(v))backtracking(stridx+1, k, path, res)*path = (*path)[0 : len(*path) - 1]}return
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779237.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

freemarker实现动态行单元格合并

原文链接:https://www.cnblogs.com/10158wsj/p/11211471.html https://blog.csdn.net/weixin_43667830/article/details/106936546 项目需求:项目中有个需求,需要将一些数据库中的数据根据需求导出,生成一个word,研究了一些技术,其中包括POI、freemaker,对比了一下实现过…

Xbox Game Pass Ultimate one dollar Trial All In One

Xbox Game Pass Ultimate one dollar Trial All In One XGPU $1 美元试用 Xbox Game Pass Ultimate — 14 Day Trial Recurs MonthlyXbox Game Pass Ultimate one dollar Trial All In OneXGPU $1 美元试用Xbox Game Pass Ultimate — 14 Day Trial Recurs Monthly Xbox Game P…

代码静态测试工具 Helix QAC 2024.1版新功能解读

Helix QAC 2024.1改进了对C++20和C23语言特性的支持,并增加了分析使用多个编译器的项目的新功能。此外,Validate增强了对于搜索功能和角色权限的用户体验,并且包括一个新的问题列表的CSV下载选项。此版本还包括对于C/C++的CWE、C的HKMC和MISRA C++:2023合规模块的扩展执行,…

苹果与英伟达公开分手,谷歌 TPU 芯片成为苹果 AI 训练新利器

苹果公司发布论文公开其 AI 模型的训练细节,放弃英伟达GPU而转向选择谷歌TPU芯片。科技巨头们在尖端 AI 训练方面开始寻求更多元化的算力硬件解决方案。北京时间 7 月 30 日,苹果公司发布了一篇研究论文,论文显示苹果公司使用了谷歌开发的 TPU 芯片而非英伟达的 GPU 芯片来训…

三色法GC总结

作用:因并发标记过程中,程序还在跑。对象间的引用会发生变化,可能会导致漏标或错标情况。因此采用三色法,将扫描的各情况用颜色区别出来。 三种颜色 白色:一开始所有对象的颜色都是白色,即未扫描过的对象。 灰色:表示对象已经扫描到了,但是对象所在的引用对象,还未全部…

Dreamforce 24重磅来袭!年度盛会将有何惊喜?

作为Salesforce的旗舰会议,Dreamforce的历史已有20余年之久,是生态系统中的年度亮点。现如今,Dreamforce已经适应了线上受众的需求,通过Salesforce+提供直播和点播的参与方式。近期,Salesforce宣布Dreamforce 24将于9月17日-19日举行,一年一度的科技盛会又要开始Dreamfor…

笔记:从Aurora 8b/10b 到Aurora 64b/66b (三):自定义PHY层收发

相较于8/10来说没那么复杂,需要考虑的情况只有八种; 但是gearbox的控制需要额外的心思:每三十二周期所有操作都需要停止; 这一点在收发都需要注意; RX: 核心思想是利用header做检测,将夹杂在数据流中的控制包滤除掉;module gt_phy_rx (input wire i_rx_cl…

esp32安装circuitpython

安装Thonny https://thonny.org/ 在Thonny中安装circuitpython 在配置解释器中选择circuitython然后点击右下角“安装或更新...“variant这里我选择了 DOIT esp32 Development Board(试过其他的一些个,不知道为什么安装完之后会无限重启,所以最后选择了这个) 烧录完之后,重…

Linux内核学习—— 1内核体系结构

一 内核体系结构 1内核模式与体系结构 2内核中断概括 3进程管理概括 二 内核源码结构 三 内核引导程序 操作系统结构: 用户应用程序 操作系统服务层 内核(文件系统,内存管理,进程管理,驱动管理) 硬件系统 驱动 操作系统工作方式:把做操作系统从用户态切换到内核态(用户应…

设置windows系统下的tomcat开机自启

设置前的准备工作(配置系统环境变量) 新增CATALINA_HOME变量,变量值为tomcat的安装路径在Path中添加: %CATALINA_HOME%\bin结合安装版本问题,分正常安装版本tomcat和免安装tomcat(无service.bat)两种情况。 一、正常安装版本(tomcat安装文件有service.bat文件) 说明:安装…

基于vscode搭建freertos环境

前言 目前网上windows仿真freertos的资料都是比较久远的,不太适合现有的开发,因此重新整理了一下资料. 目标: 使用Vscode进行FreeRTOS开发和仿真. 关键词: freertos, vscode,llvm,cmake,windows 环境配置 编译器目前使用的是llvm-MinGW-msvcrt:Releases mstorsjo/llvm-mingw (…