Day 25 组合(优化)216.组合总和III 17.电话号码的字母组合

组合(优化)

先给出组合问题的回溯部分代码:

   	vector<vector<int>> result; // 存放符合条件结果的集合vector<int> path; // 用来存放符合条件结果void backtracking(int n, int k, int startIndex) {if (path.size() == k) {result.push_back(path);return;}for (int i = startIndex; i <= n; i++) {path.push_back(i); // 处理节点backtracking(n, k, i + 1); // 递归path.pop_back(); // 回溯,撤销处理的节点}}

剪枝操作优化

​ 首先明白为什么可以剪枝,以此处的n个元素操作k个元素为例,当处理的后序元素数量小于k时可以直接剪枝掉,以节省内存空间;

​ 例如,n = 4,k = 4的话,那么第一层for循环的时候,从元素2开始的遍历都没有意义了;在第二层for循环,从元素3开始的遍历都没有意义了;依次类推:(图里的每一个节点,都代表着一个for循环

​ 由图可知,由于回溯算法的实现可以视为for循环里嵌套着递归;(此处补充一下回溯到底是怎么实现的,如图)

​ 实际上剪枝操作就是在缩小for循环的范围,即改变for循环的循环条件,缩小范围:

​ 因为如果for循环选择的起始位置之后的元素个数已经不足我们需要的元素个数了,那么就没有必要搜索了

​ 具体剪枝逻辑如下:

​ 已经选择了path.size()个元素;

​ 则后续剩余所需的元素个数为k - path.size();

​ 那么要求剩余元素个数(n-i) >= (k - path.size());

​ 则要求i <= n - (k - path.size()) + 1;

​ 为啥要**+1**?,因为这个地方是i可以取到的上界,而取的集合要求是闭区间,比如n=4,k=3的时候,当path.size() = 0时,那么[1,2,3]和[2,3,4]数组都是合法的目标数组;

​ 剪枝后即为

	//略for(int i = startIndex; i <= n - (k - path.size()) + 1; i++)//略

组合总和Ⅲ

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

  • 所有数字都是正整数。
  • 解集不能包含重复的组合。

示例 1: 输入: k = 3, n = 7 输出: [[1,2,4]]

示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]]

​ 思路和77.组合的思路是一致的,但是多了一个相加等于n的限制条件;

​ 很容易知道,k就是树的深度,9就是树的宽度,树形结构如图所示:

​ 可以看出,这里很明显是需要进行剪枝操作的,多余的节点太多了;

    vector<vector<int>>	res;vector<int>	path;void backtracking(int targetSum, int k, int sum, int startIndex){if(sum > targetSum)	return;//剪枝if(path.size() == k){if(sum == targetSum)	res.push_back(path);return;}for(int i = startIndex; i <= 9 - (k - path.size()) + 1; i++ ){//剪枝,注意此处不是减k而是k-path.size()sum += i;path.push_back(i);backtracking(targetSum, k, sum, i+1);sum -= i;path.pop_back();}}

​ 整体代码如下:

class Solution {
private:vector<vector<int>>	res;vector<int>	path;void backtracking(int targetSum, int k, int sum, int startIndex){if(sum > targetSum)	return;//剪枝if(path.size() == k){if(sum == targetSum)	res.push_back(path);return;}for(int i = startIndex; i <= 9 - (k - path.size()) + 1; i++ ){//剪枝sum += i;path.push_back(i);backtracking(targetSum, k, sum, i+1);sum -= i;path.pop_back();}}
public:vector<vector<int>> combinationSum3(int k, int n) {path.clear();res.clear();backtracking(n, k, 0, 1);return res;}
};

电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

17.电话号码的字母组合

示例:

  • 输入:“23”
  • 输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].

说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

​ 题目输入的是字符串,但是字符串中的字符同时是对应着另一组字符串的数字,所以这里要进行一个映射的操作;

​ 可以用const string的形式进行映射,也可以使用map进行映射存储:

	//写法1const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};//写法2std::map<int, std::string> letterMap;letterMap[0] = "";letterMap[1] = "";letterMap[2] = "abc";letterMap[3] = "def";letterMap[4] = "ghi";letterMap[5] = "jkl";letterMap[6] = "mno";letterMap[7] = "pqrs";letterMap[8] = "tuv";letterMap[9] = "wxyz";

​ 同理,将回溯过程以树形结构表达出来:

​ 即树的深度由输入的字符串决定;

	const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};vector<string> res;string s;void backtracking(const string& digits, int index){if(index == digits.size()){//终止条件就是如果index 等于输入的数字个数(digits.size)res.push_back(s);return;}//单层遍历逻辑int digit = digits[index] - '0';//char类型运算得到int型string letters = letterMap[digit];//取对应集合的字符串for(int i = 0; i < letters.size(); i++){s.push_back(letters[i]);backtracking(digits, index + 1);s.pop_back();}      }

​ 整体代码如下:

class Solution {
private:const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};vector<string> res;string s;void backtracking(const string& digits, int index){if(index == digits.size()){//终止条件就是如果index等于输入的数字个数(digits.size)res.push_back(s);return;}//单层遍历逻辑int digit = digits[index] - '0';//char类型运算得到int型string letters = letterMap[digit];//取对应集合的字符串for(int i = 0; i < letters.size(); i++){s.push_back(letters[i]);backtracking(digits, index + 1);s.pop_back();}      }
public:vector<string> letterCombinations(string digits) {s.clear();res.clear();if (digits.size() == 0) {return res;}backtracking(digits, 0);return res;}
};

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

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

相关文章

【opencv】dnn示例-person_reid.cpp 人员识别(ReID,Re-Identification)系统

ReID(Re-Identification&#xff0c;即对摄像机视野外的人进行再识别) 0030_c1_f0056923.jpg 0042_c5_f0068994.jpg 0056_c8_f0017063.jpg 以上为输出结果&#xff1a;result文件夹下 galleryLIst.txt queryList.txt 模型下载&#xff1a; https://github.com/ReID-Team/ReID_e…

OpenHarmony网络通信-socket-io

简介 socket.io是一个在客户端和服务器之间实现低延迟、双向和基于事件的通信的库。建立在 WebSocket 协议之上&#xff0c;并提供额外的保证&#xff0c;例如回退到 HTTP 长轮询或自动重新连接。 效果展示 下载安装 ohpm install ohos/socketio OpenHarmony ohpm 环境配置等更…

VulnHub靶机 DC-5 打靶 渗透测试详情过程

VulnHub靶机 DC-5 打靶 详细渗透测试过程 目录 VulnHub靶机 DC-5 打靶 详细渗透测试过程一、将靶机导入到虚拟机当中二、渗透流程主机发现端口扫描目录爆破文件包含getshell反弹shell提权 一、将靶机导入到虚拟机当中 靶机地址&#xff1a; https://download.vulnhub.com/dc/…

【云计算】云计算八股与云开发核心技术(虚拟化、分布式、容器化)

【云计算】云计算八股与云开发核心技术&#xff08;虚拟化、分布式、容器化&#xff09; 文章目录 一、什么是云计算&#xff1f;1、云计算的架构&#xff08;基础设施&#xff0c;平台&#xff0c;软件&#xff09;2、云计算的发展 二、如何做云计算开发&#xff1f;云计算的核…

量子时代加密安全与区块链应用的未来

量子时代加密安全与区块链应用的未来 现代密码学仍然是一门相对年轻的学科&#xff0c;但其历史却显示了一种重要的模式。大多数的发展都是基于几年甚至几十年前的研究。而这种缓慢的发展速度也是有原因的&#xff0c;就像药物和疫苗在进入市场之前需要经过多年的严格测试一样&…

心学从0开始学习rust-十万个为什么篇章(持续更新篇章)

问答环节 1.const x 1;和let x 1有何区别呢&#xff0c;const申请的是全局变量所以会一直有效对吗&#xff1f; const 声明的常量具有全局作用域&#xff0c;但它们不能直接在函数内部声明。常量通常用于定义整个程序中使用的值&#xff0c;如配置常量或数学常量。 let 声明…

tcp网络编程——2

1.一个服务器只能有一个客户端连接&#xff08;下面代码&#xff09; ​​​​​​​tcp网络编程&#xff08;基础&#xff09;-CSDN博客 2.一个服务器可以有多个客户端连接&#xff08;多线程&#xff09; server端创建多个线程&#xff0c;每个线程与不同的client端建立连…

浅写个登录(无js文件)

全部代码如下&#xff0c;无需编写wxss文件&#xff0c;渲染都在style里面&#xff1a; <view style"height: 250rpx;width: 100%;"> <!-- 背景图片 --><view style"position: absolute; background-color: antiquewhite; height: 250rpx;width…

IDEA中Docker相关操作的使用教程

一、引言 Docker作为当前最流行的容器化技术&#xff0c;极大地简化了应用的部署和管理。而IntelliJ IDEA作为一款强大的集成开发环境&#xff0c;也提供了对Docker的集成支持。本文将介绍如何在IDEA中配置和使用Docker&#xff0c;包括远程访问配置、服务连接、Dockerfile编写…

【C语言】冒泡排序算法详解

目录 一、算法原理二、算法分析时间复杂度空间复杂度稳定性 三、C语言实现四、Python实现 冒泡排序&#xff08;Bubble Sort&#xff09;是一种基础的排序算法。它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。遍历数列…

微信小程序开发笔记

微信小程序开发笔记 1 微信小程序的项目结构 2 页面组成 一个微信小程序是由一个或多个页面组成的&#xff0c;这些页面被存放在pages目录中。下面以pages 目录下的index页面为例展示其组成部分&#xff0c;index页面的组成部分如下图所示。 由上图可知&#xff0c;index页面…

hbase-2.2.7分布式搭建

一、下载上传解压 1.在官网或者云镜像网站下载jar包 华为云镜像站&#xff1a;Index of apache-local/hbase/2.2.7 2.上传到linux并解压 tar -zxvf hbase-2.2.7-bin.tar.gz -C /usr/locol/soft 二、配置环境变量 1. vim /etc/profile export HBASE_HOME/usr/local/soft/h…

前端三剑客 HTML+CSS+JavaScript ② HTML相关概念

他们这样形容我 是暴雨浇不灭的火 —— 24.4.18 学习目标 理解 HTML的概念 HTML的分类 HTML的关系 HTML的语义化 应用 HTML骨架格式 sublime基本使用 一、HTML初识 HTML指的是超文本标记语言&#xff0c;是用来描述网页的一种语言 超文本&#xff1a;暂且理解为“超级的文本”&…

【opencv】dnn示例-segmentation.cpp 通过深度学习模型对图像进行实时语义分割

模型下载地址&#xff1a; http://dl.caffe.berkeleyvision.org/ 配置文件下载&#xff1a; https://github.com/opencv/opencv_extra/tree/4.x/testdata/dnn 该段代码是一个利用深度学习进行语义分割的OpenCV应用实例。下面将详细解释代码的功能和方法。 引入库 引入了一些必要…

(最详细)关于List和Set的区别与应用

关于List与Set的区别 List和Set都继承自Collection接口&#xff1b; List接口的实现类有三个&#xff1a;LinkedList、ArrayList、Vector。Set接口的实现类有两个&#xff1a;HashSet(底层由HashMap实现)、LinkedHashSet。 在List中&#xff0c;List.add()是基于数组的形式来添…

内部类

一.概念 当一个事物内部&#xff0c;还有一个部分需要一个完整的结构进行描述&#xff0c;而这个内部的完整的结构又只为外部事物提供服务&#xff0c;那么将这个内部的完整结构最好使用内部类。在Java中&#xff0c;可以将一个类定义在另一个类或者一个方法内部&#xff0c;前…

将gdip-yolo集成到yolov9模型项目中(支持预训练的yolov9模型)

1、yolov9模型概述 1.1 yolov9 YOLOv9意味着实时目标检测的重大进步&#xff0c;引入了可编程梯度信息&#xff08;PGI&#xff09;和通用高效层聚合网络&#xff08;GELAN&#xff09;等开创性技术。该模型在效率、准确性和适应性方面取得了显著改进&#xff0c;在MS COCO数…

GNU Radio使用Python Block实现模块运行时间间隔获取

文章目录 前言一、timestamp_sender 模块二、timestamp_receiver 模块三、测试 前言 GNU Radio 中没有实现测量两个模块之间的时间测量模块&#xff0c;本文记录一下通过 python block 制作一个很简单的测时 block。 一、timestamp_sender 模块 使用 python block 做一个发送…

【python】super()函数的用法详解!

今天分享一个我在实际项目中用到过的super()函数&#xff0c;来说说该函数的主要功能是什么&#xff0c;简单来说&#xff0c;super()函数是用来做调用父类的一个方法。 super() 是用来解决多重继承问题的&#xff0c;直接用类名调用父类方法在使用单继承的时候没问题&#xf…

外包干了30天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…