代码随想录算法训练营day25 || 216.组合总和III,17.电话号码的字母组合

视频讲解:

还得用回溯算法!| LeetCode:17.电话号码的字母组合_哔哩哔哩_bilibili

和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili

216.组合总和III

思路:本题是 77.组合 的进阶,也是不重复地选择元素集合的K个元素形成结果,并且也需要主要的到的是元素选择所形成的集合是组合而非排列,因此当元素集合内元素有序时,选择的方向必须只有一个方向;其次本题额外多的条件是K个数和为n,添加至回溯模版内递归条件的终止条件部分。

// 时间复杂度上限会达到O(n^k)
// 空间复杂度上限O(n*(n-1)*(n-2)*……*(n-k+1))class Solution {List<Integer> path = new ArrayList<>();List<List<Integer>> ans = new ArrayList<>();public List<List<Integer>> combinationSum3(int k, int n) {// 题目的本质就是K个数的组合,但是增加了K个数的和需要等于k,那么也就是进入结果集的组合少了// 不存在需要判断边缘条件的情况,因为给的参数里面不涉及会出现异常情况的数组或者字符串等引用类型的元素backtracking(0, n, k, 0, 0);return ans;}public void backtracking(int sum, int n, int k, int count, int index){if(count == k){if(sum == n)ans.add(new ArrayList<>(path));return;}// 剪枝条件int limit = 9-k+count+1;for(int i = index+1; i<=limit; i++){// 处理结果集sum += i;count++;path.add(i);backtracking(sum, n, k, count, i);path.remove(path.size()-1);// 回溯操作sum -= i;count--;}return;}
}

17.电话号码的字母组合

思路:首先明确题意是将字符串内的每个数字替换为3-4个字符中的一个;递归每一层遍历的是当前数字所对应的字符集内的所有字符,这与 组合问题以及组合问题||| 都是不同的,这两个问题的元素集合在每一次递归中都是共用的,每次都将从元素集合内选择部分元素,因此存在元素无法满足进行递归研究的可能,所以存在剪枝的可能。

而本题每一次递归都是访问的不同的元素集合,集合内每个元素都可以随机的选择,然后组合K个英文字母形成结果,不存在剪枝的可能。

采用回溯方法进行解题,就是首先明确访问的元素集合是什么,其次每一次访问元素集合元素集合有哪些要求(比如不可重复取、是组合而不是排列等等);依据两个前提,将每次集合操作映射为递归步骤——访问元素可映射为元素处理、集合的要求可映射为各种判断条件;

在这样的思路确定下,沿用回溯模版解题。回溯问题,本质上就是将一个大问题划分为多个小问题,将可解的小问题完成后回溯拼接所有的小问题结果形成原问题的解答。所以一定要在读题时厘清题目中每个结果是如何形成的,每一步内容做的什么,从而形成小问题的认识,即可得到逐层递归所做的内容,例如每个数字对应的字符集遍历,选择一个数字之后下一次还可以选择的数字来加入当前的组合中。

// 时间复杂度O(3^m*4^n),m,n分别为出现对应3个或4个字符集的数字的个数,也是每一次for循环遍历的范围
// 空间复杂度O(3^m*4^n),一共有这么多种结果被产生class Solution {List<String> ans = new ArrayList<>();StringBuilder builder = new StringBuilder();public List<String> letterCombinations(String digits) {if(digits == null || digits.equals(""))return ans;List<char[]> list = new ArrayList<>();list.add(new char[]{'a','b','c'});          // 2list.add(new char[]{'d','e','f'});          // 3list.add(new char[]{'g','h','i'});          // 4list.add(new char[]{'j','k','l'});          // 5list.add(new char[]{'m','n','o'});          // 6list.add(new char[]{'p','q','r','s'});      // 7list.add(new char[]{'t','u','v'});          // 8list.add(new char[]{'w','x','y','z'});      // 9// 从第个数字开始backtracking(list, digits, 0);return ans;}public void backtracking(List<char[]> list, String digits, int index){// 终止条件if(index == digits.length()){ans.add(builder.toString());return;}// index代表当前访问到字符串内的第 index+1 个数字char ch = digits.charAt(index);// 获取当前数字对应的数组char[] arr = list.get(ch-'2');for(int i=0; i<arr.length; i++){// 处理结果集builder.append(arr[i]);backtracking(list, digits, index+1);builder.deleteCharAt(builder.length()-1);}return;}
}

 

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

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

相关文章

浏览器插件:WebScraper基本用法和抓取页面内容(不会编程也能爬取数据)

Web Scraper 是一个浏览器扩展&#xff0c;用于从页面中提取数据(网页爬虫)。对于简单或偶然的需求非常有用&#xff0c;例如正在写代码缺少一些示例数据&#xff0c;使用此插件可以很快从类似的网站提取内容作为模拟数据。从 Chrome 的插件市场安装后&#xff0c;页面 F12 打开…

RT-Thread experimental 代码学习(1)thread_sample

RTOS的最基础功能是线程。 线程的调度是如何工作的&#xff1f;RT-thread官方的实验文档是最好的参考。 老规矩&#xff0c;先放法国人doxygen。 thread_sample 代码的调用关系图 有意思的是&#xff0c;RT有两种创建线程的方式 - 静态和动态&#xff0c;粗略的理解是&…

微信小程序之WXML 模板语法之数据绑定、事件绑定、wx:if和列表渲染

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

数字图像处理期末速成笔记

目录 一、基础知识二、相邻像素间基本关系三、图像增强方法1、直方图求解2、直方图均衡化3、直方图规定化4、图像平滑5、邻域平均法&#xff08;线性&#xff09;6、 中值滤波法&#xff08;分线性&#xff09;7、中值滤波与领域平均的异同8、4-邻域平滑法9、超限像素平滑法10、…

我们应该了解的⽤户画像

当我们谈⽤户画像时&#xff0c;到底在谈什么 对于互联⽹公司来说&#xff0c;企业的增⻓、内容、活动、产品等⼯作基本上都是围绕着“⽤户”来做的&#xff0c;可以说都是在做“⽤户运营”这个⼯作&#xff0c;⽽⽤户画像是⽤户运营⼯作中⾮常重要的⼀环 ⽤户画像的主要特征是…

【js】js 异步机制详解 Generator / Async / Promise

三种语法功能放在一起&#xff0c;是因为他们都有相似特点&#xff1a; 维护某种状态在未来恢复状态并执行 本文重点回答以下几个问题&#xff1a; 为什么 Generator 和 Async 函数的 代码执行流 都可以简化成树形结构&#xff1f;async 函数为什么返回一个 promise&#xf…

Cloudreve存储策略-通过从机存储来拓展容量

Sham的云服务器是搬瓦工最低低低配的&#xff0c;1H 0.5G不说&#xff0c;硬盘容量也只有10g&#xff0c;说实话&#xff0c;装了宝塔面板和服务器套件后&#xff0c;基本满了&#xff0c;这时又想在云服务器上打个网盘用于下载、存储&#xff0c;这时就需要拓展硬盘&#xff0…

【podman】podman学习

Podman 官网 快速开始 面向 Docker 用户的 Podman 和 Buildah Podman是一个开源的容器、pod和容器映像管理引擎。Podman使查找、运行、构建和共享容器变得容易。 Podman Desktop是Podman的图形应用程序&#xff0c;使其易于在Windows、MacOS和Linux上安装和使用Podman&…

烟火检测AI边缘计算智能分析网关V4如何通过ssh进行服务器远程运维

智能分析网关V4是一款高性能、低功耗的AI边缘计算硬件设备&#xff0c;它采用了BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz&#xff0c;并且INT8峰值算力高达17.6Tops&#xff0c;FB32高精度算力达到2.2T&#xff0c;每个摄像头可同时配置3种算法&…

npm, yarn和pnpm清理缓存

文章目录 前言npm查看缓存路径清理缓存 yarn查看缓存路径清理缓存 pnpm查看缓存路径清理缓存 前言 npm, yarn和pnpm是时下主流的node.js包管理器。 随着前端项目的增多&#xff0c;会下载许多的依赖。不管是哪种包管理器&#xff0c;都会使用缓存来增加下次下载的速度。但很多…

Fiddler基础使用指南

1. Fiddler介绍 Fiddler 是一款抓包工具&#xff0c;可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作&#xff0c;也可以用来检测网络安全 2. 设置过滤 通过设置过滤条件&#xff0c;可以使抓包工具过滤掉非目标包 3. 删除数据 被抓取的包可以进行手动删除 …

使用aspera下载SRA数据速度高达 下载中国gsa数据? ascp

转载自&#xff1a;秘籍 | 惊了&#xff0c;使用aspera下载SRA数据速度高达 291Mb/s - 简书 一、安装Aspera Connect 安装Linux版的Aspera Connect # 上面链接是最新版&#xff0c;因此下载的时候去官网复制最新的链接地址下载&#xff0c;否则可能会报错 wget https://d3gcli…

54 C++ 多线程 条件变量 condition_variable,wait(),notify_one()

一 前提&#xff1a;之前代码的缺陷 在前面我们使用两个线程 &#xff0c;一个线程读&#xff0c;一个线程写来完成对于共享数据访问。 我们把这个代码 先放在这里&#xff0c;方便回忆&#xff0c;然后说明代码可能存在的问题&#xff0c;然后改动。 class Teacher174 { pri…

奇偶性【高数笔记】

【如何判断奇偶性】 1.根据定义&#xff1a;f(x) - f(-x) 奇函数&#xff1b;f(x) f(-x) 偶函数 2.运算法则&#xff1a;四则运算和复合运算 #四则中&#xff0c;奇偶相加为非奇非偶 #复合运算&#xff1a;内偶则偶&#xff0c;内奇看外 3.已知的常识函数&#xff1a; 奇函数&…

Elasticsearch Index Shard Allocation 索引分片分配策略

Elasticsearch 索引分片的分配策略说明 在上一篇《索引生命周期管理ILM看完不懂你锤我 》&#xff08;https://mp.weixin.qq.com/s/ajhFp-xBU1dJm8a1dDdRQQ&#xff09;中&#xff0c;我们已经学会了索引级别的分片分配过滤属性&#xff0c;也就是在配置文件中指定当前节点的属…

牛客刷题之字符串

文章目录 字符串的长度(len)字符串的大小写删除字符串的指定字符字符串的重复输出&#xff08;不用循环语句&#xff09;字符的指定长度的输出&#xff08;切片&#xff09;字符串分隔 字符串的长度(len) str input()print(len(str))字符串的大小写 upper()全部大写 , lower()…

基于JavaWeb+SSM+Vue基于微信小程序的网上商城系统的设计和实现

基于JavaWebSSMVue基于微信小程序的网上商城系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 滑到文末获取源码 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想…

HTB Monitored

Monitored user Nmap ┌──(kali㉿kali)-[~] └─$ nmap -A 10.10.11.248 Starting Nmap 7.80 ( https://nmap.org ) at 2024-01-14 23:42 CST Stats: 0:00:15 elapsed; 0 hosts completed (1 up), 1 undergoing Connect S

一步一步写线程之五线程池的模型之一领导者追随者模型

一、线程池的模型 在学习过相关的多线程知识后&#xff0c;从更抽象的角度来看待多线程解决问题的方向&#xff0c;其实仍然是典型的生产和消费者的模型。无论是数据计算、存储、分发和任务处理等都是通过多线程这种手段来解决生产者和消费者不匹配的情况。所以&#xff0c;得…

软件测试的工作描述

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…