代码随想录算法训练营第二十二天| 77. 组合 216.组合总和III 17.电话号码的字母组合

news2024/11/27 8:26:27

77. 组合

题目:

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

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

示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n

思路:

给定 nk,要求从 [1, n] 范围内选出 k 个数字的所有组合。我们可以用回溯的方法来解决:

  1. 初始状态: 我们从空组合开始,然后逐步增加元素。

  2. 选择: 从当前的数字 start 开始,我们可以选择一个数字 istart <= i <= n)加入当前组合,然后递归地去选择下一个数字。

  3. 递归: 在每次选择一个数字加入当前组合后,我们递归地选择下一个数字,直到组合的长度达到 k。一旦组合长度达到 k,我们就将其加入到结果集中。

  4. 撤销选择: 当我们递归返回时(即完成了某个数字的全部后续选择的探索),我们会将这个数字从组合中移除,尝试其他可能的数字。

  5. 结束条件: 当当前组合的长度达到 k,或当所有可能的数字都被尝试过,我们就结束当前递归的探索。

上代码:

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<vector<int>> result; // 保存所有组合的结果
        vector<int> currentCombination; // 当前组合
        backtrack(result, currentCombination, n, k, 1); // 从数字1开始
        return result;
    }
    
private:
    void backtrack(vector<vector<int>>& result, vector<int>& currentCombination, int n, int k, int start) {
        // 如果当前组合的长度等于k,将其添加到结果中
        if (currentCombination.size() == k) {
            result.push_back(currentCombination);
            return;
        }
        
        // 从当前数字开始到n,逐个尝试
        for (int i = start; i <= n; ++i) {
            currentCombination.push_back(i); // 将当前数字加入到当前组合
            backtrack(result, currentCombination, n, k, i + 1); // 递归调用,开始下一个数字
            currentCombination.pop_back(); // 回溯,移除最后一个数字
        }
    }
};

216.组合总和III

题目:

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字 最多使用一次 

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。

示例 3:

输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。

提示:

  • 2 <= k <= 9
  • 1 <= n <= 60

思路:

可以使用回溯的方法来解决这个问题。

在这个问题中,我们需要找到所有满足条件的 k 个数的组合,这些数字相加的和为 n,并且只能使用数字 19,且每个数字最多使用一次。

回溯的思路

  1. 选择和决策: 从数字 1 开始,我们可以选择一个数字加入当前组合,然后继续选择下一个数字,直到组合长度达到 k 或组合和达到 n

  2. 递归探索: 每次选择一个数字后,进入下一层的递归,继续选择下一个数字。如果发现当前组合的和超过了 n 或组合长度超过了 k,则可以立即停止当前路径的探索,回溯到上一步。

  3. 撤销选择(回溯): 如果递归到某个阶段后,发现当前路径不符合要求,我们就撤销最近的选择,回溯到上一个状态,尝试其他可能的选择。

  4. 结束条件: 当当前组合的长度等于 k 且和等于 n 时,将当前组合加入到结果中。当所有可能的数字都被尝试过,或者组合的和已经超过 n 时,结束当前递归。

上代码:

class Solution {
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        vector<vector<int>> result; // 保存所有组合的结果
        vector<int> currentCombination; // 当前组合
        backtrack(result, currentCombination, k, n, 1); // 从数字1开始
        return result;
    }
    
private:
    void backtrack(vector<vector<int>>& result, vector<int>& currentCombination, int k, int n, int start) {
        // 如果当前组合的长度等于k且和等于n,将其添加到结果中
        if (currentCombination.size() == k && n == 0) {
            result.push_back(currentCombination);
            return;
        }
        
        // 如果当前组合的长度超过k,或和已经小于0,则直接返回
        if (currentCombination.size() >= k || n < 0) {
            return;
        }
        
        // 从当前数字开始到9,逐个尝试
        for (int i = start; i <= 9; ++i) {
            currentCombination.push_back(i); // 将当前数字加入到当前组合
            backtrack(result, currentCombination, k, n - i, i + 1); // 递归调用,开始下一个数字
            currentCombination.pop_back(); // 回溯,移除最后一个数字
        }
    }
};

17.电话号码的字母组合

题目:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

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

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

思路:

这个问题可以通过回溯算法来解决。

我们需要从给定的数字字符串 digits 中生成所有可能的字母组合。每个数字对应多个字母,因此我们需要逐个尝试每个数字可能的字母组合。

回溯思路

  1. 映射: 首先要定义数字到字母的映射(类似电话按键),比如 '2' 对应 'abc','3' 对应 'def',以此类推。

  2. 递归探索: 从第一个数字开始,选择其对应的一个字母,然后递归地处理下一个数字,直到处理完所有的数字。

  3. 组合生成: 每次递归时,将当前选择的字母加入到当前组合中。如果当前组合的长度等于 digits 的长度,表示生成了一个完整的组合,将其加入到结果集中。

  4. 回溯: 如果当前组合未完成(即还未处理完所有的数字),则递归处理下一个数字的字母选择。完成后,回溯到上一个状态,继续尝试其他可能的字母组合。

  5. 终止条件: 当 digits 为空时,返回空列表;当遍历完所有数字时,递归终止。

上代码:

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        // 定义数字到字母的映射
        vector<string> mapping = {
            "",     // '0' 无映射
            "",     // '1' 无映射
            "abc",  // '2' 映射到 'abc'
            "def",  // '3' 映射到 'def'
            "ghi",  // '4' 映射到 'ghi'
            "jkl",  // '5' 映射到 'jkl'
            "mno",  // '6' 映射到 'mno'
            "pqrs", // '7' 映射到 'pqrs'
            "tuv",  // '8' 映射到 'tuv'
            "wxyz"  // '9' 映射到 'wxyz'
        };
        
        vector<string> result; // 保存所有组合的结果
        
        // 如果输入为空,直接返回空列表
        if (digits.empty()) return result;
        
        string currentCombination; // 当前组合
        backtrack(result, mapping, digits, currentCombination, 0); // 从第0个数字开始
        return result;
    }
    
private:
    void backtrack(vector<string>& result, const vector<string>& mapping, const string& digits, string& currentCombination, int index) {
        // 如果当前组合的长度等于数字字符串的长度,将其添加到结果中
        if (index == digits.size()) {
            result.push_back(currentCombination);
            return;
        }
        
        // 取得当前数字对应的字母串
        string letters = mapping[digits[index] - '0'];
        
        // 遍历当前数字对应的所有字母
        for (char letter : letters) {
            currentCombination.push_back(letter); // 将当前字母加入到当前组合
            backtrack(result, mapping, digits, currentCombination, index + 1); // 递归处理下一个数字
            currentCombination.pop_back(); // 回溯,移除最后一个字母
        }
    }
};

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

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

相关文章

VAuditDemo安装漏洞

目录 VAuditDemo安装漏洞 index.php header.php config.php lib.php install.php 分析结果 漏洞利用 第一步&#xff1a;删除install.lock文件&#xff0c;访问 install.php 抓包 第二步&#xff1a;通过审计构造payload 第三步&#xff1a;修改抓包请求内容&#x…

客户分级管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示为什么选择我官方认证闲鱼玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参考源码获取…

《python语言程序设计》2018版第7章第10题设计一个名为time的类,包括hour minute second

#main代码段 def main():a int(time.time())total_second int(a)current_second total_second % 60total_minutes total_second // 60current_minute total_minutes % 60total_hours total_minutes // 60current_hour total_hours % 24b exCode07.Time(current_hour,cu…

SpringBoot中生成二维码的案例实战

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

基于数据复杂度的数据库选型

数据模型的选择对于 IT 系统的开发至关重要&#xff0c;它不仅决定了数据存储和处理的方式&#xff0c;影响系统的性能、扩展性以及维护性等。本质上来说&#xff0c;不同的数据模型反映了我们对业务问题的不同思考和抽象程度。 今天我们从不同数据模型对于复杂数据和关系的支…

定制化三防平板:为专业领域打造的坚固解决方案

在科技时代&#xff0c;移动设备已经成为各行各业不可或缺的工具。然而&#xff0c;对于一些特殊行业&#xff0c;如军事、野外勘探、物流、医疗和制造业等&#xff0c;普通商用平板往往无法满足其严苛的工作环境需求。三防平板&#xff0c;以其卓越的防护性能和高度的定制化能…

有了这4款工具,你就知道电脑怎么录屏了!

电脑屏幕录屏这个问题很多人都会碰到&#xff0c;比如教学视频录制&#xff0c;游戏技巧分享&#xff0c;软件操作演示等等。因为场景众多&#xff0c;电脑自带的录屏功能不一定能满足&#xff0c;所以借助第三方工具是一个很有效的办法。如果大家不知道如何录屏&#xff0c;可…

网络安全-安全策略初认识

文章目录 前言理论介绍1. 安全策略1.1 定义&#xff1a;1.2 关键术语&#xff1a; 2. 防火墙状态监测 实战步骤1&#xff1a;实验环境搭建步骤2&#xff1a;配置实现 总结1. 默认安全策略2. 自定义安全策略3. 防火墙状态会话表 前言 who&#xff1a;本文主要写给入门防火墙的技…

【Vue3】集成 Ant Design Vue

【Vue3】集成 Ant Design Vue 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗…

SX_gitlab可视化操作c语言知识_17

gitlab可视化操作技巧: Merge into current branch直接将远程wjc_GNSS分支的数据拉下来同步到本机当前的分支代码&#xff0c;执行的是合并操作&#xff0c;即多的模块会添加到本地分支&#xff0c;有冲突的地方不行得rebase覆盖才行 修改完代码先暂存更改再在暂存区写入备注&a…

特斯拉FSD硬件进化

特斯拉FSD硬件进化 历经十年&#xff0c;特斯拉自动驾驶软硬件系统不断进化。硬件&#xff1a;HW1.0 到 HW4.0&#xff0c;自研比例与配置性能不断提升。 2013 年&#xff0c;马斯克于推特披露特斯拉正在进行辅助驾驶系统 AP&#xff08;Autopilot System&#xff09;的研发&…

鸿蒙(API 12 Beta3版)【使用ImageSource完成图片解码】图片开发指导

图片解码指将所支持格式的存档图片解码成统一的[PixelMap]&#xff0c;以便在应用或系统中进行图片显示或[图片处理]。当前支持的存档图片格式包括JPEG、PNG、GIF、WebP、BMP、SVG、ICO、DNG。 开发步骤 全局导入Image模块。 import { image } from kit.ImageKit;获取图片。…

Compose知识分享

前言 “Jetpack Compose 是一个适用于 Android 的新式声明性界面工具包。Compose 提供声明性 API&#xff0c;让您可在不以命令方式改变前端视图的情况下呈现应用界面&#xff0c;从而使编写和维护应用界面变得更加容易。” 以上是Compose官网中对于Compose这套全新的Androi…

MidJourney付费失败的原因以及失败后如何取消或续订(文末附MidJourney,GPT-4o教程)

MidJourney付费失败的原因 MidJourney付费失败的原因可能包括支付方式无效、支付信息错误、网络问题、账户设置问题等。 ‌支付方式无效或信息错误‌&#xff1a;如果用户提供的支付方式&#xff08;如信用卡&#xff09;信息不正确&#xff0c;或者支付方式本身不支持该地区…

Python使用matplotlib计算并绘制图像的直方图

除了使用OpenCV计算图像直方图外&#xff0c;matplotlib也提供了直方图计算并绘制功能&#xff0c;只需要把图像&#xff08;或对应通道&#xff09;作为参数输入&#xff0c;即可通过matplotlib输出直方图&#xff08;标准直方图&#xff0c;非条形图表达&#xff09;&#xf…

LVS负载均衡群集-DR模式

一、负载均衡群集 1.数据包流向分析 客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。Director Server 和 Real Server 在同一个网络中&#xff0c;数据通过…

MKS MWH-5匹配器Automatc matching impedance Network手侧

MKS MWH-5匹配器Automatc matching impedance Network手侧

Golang基础语法学习与速成

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 目录 1.golang介绍 1.1介绍 1.2优势 2.语法 2.1控制台输出 2.2算术运算符 2.3变量常量 2.4for循环 2.5if语句 2.6switch语句 2.7作用域 2.8浮点数和零值 2.8.1浮点数 2.8.2零值 2.9格式化…

【鸿蒙学习】HarmonyOS应用开发者高级认证 - 自由流转

学完时间&#xff1a;2024年8月21日 学完排名&#xff1a;第2253名 一、基本概念 1. 流转 在HarmonyOS中&#xff0c;将跨多设备的分布式操作统称为流转。流转能力打破设备界限&#xff0c;多设备联动&#xff0c;使用户应用程序可分可合、可流转&#xff0c;实现如邮件跨设…

【时时三省】(C语言基础)指针进阶

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 指针的概念 1 .指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 2 .指针的大小是固定的4 /8个字节(32位平台/64位平台)。 3 .指针是有类型&#xff0c;指…