第二十五天| 216.组合总和III、17.电话号码的字母组合

news2024/9/23 13:16:43

Leetcode 216.组合总和III

题目链接:216 组合总和III

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

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

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

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

思考:回溯法。先设计全局变量结果集result,路径集path。再考虑回溯函数:

函数返回值以及参数
参数含义
k满足条件的组合内数的个数
targetSum满足条件的组合内数相加之和
sum当前路径内数相加之和
startIndex下一层循环搜索的起始位置

终止条件:在路径path 满足条件长度k后,判断当前sum是否满足targetSum,若满足则添加到容器result内。

单层搜索逻辑:从startIndex开始循环添加到路径path中,再递归处理,最后再回溯。

剪枝优化处理:

  • 若for循环选择的起始位置之后的元素个数已经不足需要的元素个数则后序数就没有必要搜索
  • for循环中若加入当前数sum值超过目标值targetSum则后序数就没有必要搜索

代码: 

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(int k, int targetSum, int sum, int startIndex) {
        if (path.size() == k) {
            if (sum == targetSum)
                result.push_back(path);
            return;
        }

        for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
            //剪枝操作,若当前数加入路径后相加之和大于目标值则结束循环
            if (sum + i > targetSum)        
                break;
            else {
            sum += i;
            path.push_back(i);
            backtracking(k, targetSum, sum, i + 1);
            //回溯
            sum -= i;
            path.pop_back();
            }
        }
    }

    vector<vector<int>> combinationSum3(int k, int n) {
        result.clear();
        path.clear();
        backtracking(k, n, 0, 1);
        return result;
    }
};

Leetcode 17.电话号码的字母组合

题干链接:17 电话号码的字母组合

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

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

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

思考:回溯法。先定义静态数字与字母的映射表,全局变量结果集result,路径集path。再考虑回溯函数:

函数返回值以及参数
参数含义
digits题干给定字符串
index字符串中某个字符的下标

终止条件:若当前遍历到字符串最后一个字符则将路径path加入结果集result。

单层搜索逻辑:先取出当前处理数字对应的字母集,再循环处理该字母集中的字符,添加到路径,递归处理,回溯移除路径。

代码:

class Solution {
public:
    const string letterMap[10] {        //数字与字母的映射表
        "", "",     //0、1
        "abc", "def",       //2、3
        "ghi", "jkl",       //4、5
        "mno", "pqrs",      //6、7
        "tuv", "wxyz"       //8、9
    };

    vector<string> result;
    string path;
    void backtracking(string& digits, int index) {
        if (index == digits.size()) {
            result.push_back(path);
            return;
        }

        string s = letterMap[digits[index] - '0'];      //取当前处理数字对应的字母集
        for (int i = 0; i < s.size(); i++) {
            path += s[i];
            backtracking(digits, index + 1);
            path.pop_back();        //回溯
        }
    }

    vector<string> letterCombinations(string digits) {
        result.clear();
        if (digits.size() == 0) return result;
        path = "";
        backtracking(digits, 0);
        return result;
    }
};

自我总结:

  • 熟悉回溯三部曲,for循环横向遍历,递归纵向遍历,回溯不断调整结果集。

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

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

相关文章

【Qt5小项目】接金币小游戏

代码量在250行左右&#xff0c; 需要源码的可以私信我。

蓝桥杯嵌入式第六届真题(完成)STM32G431

蓝桥杯嵌入式第六届真题&#xff08;完成&#xff09;STM32G431 题目部分 相关文件 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program b…

计算机科学导论(0)冯诺依曼体系结构

文章目录 定义主要特点缺陷定义 冯诺依曼体系结构(Von Neumann architecture),也称为普林斯顿体系结构(Princeton architecture),是一种计算机架构理论,由匈牙利数学家和物理学家约翰冯诺依曼(John von Neumann)在1945年提出。这一体系结构是现代计算机设计的基础,其…

Python(SQLite)executescript用法

SQLite 数据库模块的游标对象还包含了一个 executescript() 方法&#xff0c;这不是一个标准的 API 方法&#xff0c;这意味着在其他数据库 API 模块中可能没有这个方法。但是这个方法却很实用&#xff0c;它可以执行一段 SQL 脚本。 例如&#xff0c;如下程序使用 executescr…

Leetcode刷题笔记题解(C++):99. 恢复二叉搜索树

思路&#xff1a; 二叉搜索树的中序遍历是递增序列&#xff0c;可以在中序遍历中记录两个需要交换的节点&#xff0c;直到遍历完毕之后&#xff0c;对两个节点的值进行交换即可得到正确的二叉搜索树 比如中序序列为 1 2 3 7 5 6 4&#xff08;7比5大记录7为x&#xf…

FlashFXP 下载、安装、使用

官网 FlashFXP - Secure FTP Client Software for Windows. Upload, Download, and Synchronize your files. 下载 使用 新建连接 输入ftp服务器信息 下图说明连接上了

第五讲:函数与类库

第五讲&#xff1a;函数与类库 第五讲&#xff1a;函数与类库函数定义实参变量的作用域返回值代码复用 类创建和使用类继承导入类 模块与库概念标准库第三方库 第五讲&#xff1a;函数与类库 函数 定义 函数就是代码块&#xff0c;只不过我们给这个代码块特地进行命名&#…

2023年哪个前端框架用的最多?

2023 年&#xff0c;TypeScript 的每月下载量持续稳定增长&#xff0c;年度累计下载量高达2,071,832,110&#xff08;20.7 亿&#xff09;&#xff0c;展现了强大的市场需求和用户认可。 本文来通过详细的数据&#xff08;2023 年 npm 累计下载量&#xff09;&#xff0c;看看…

vio参数文件内相机imu参数的修改

imu标定工具 https://github.com/mintar/imu_utils网络上有各种IMU校准工具和校准教程&#xff0c;曾经花费了巨大精力跟着各种教程去跑校准。 然而&#xff0c;标定使用的数据都是在静止状态下录制的&#xff0c;我们在使用vio或者imu-cam联合标定的时候&#xff0c;imu确是处…

Activity的启动流程

小伙伴们面试的时候是不是被问过Activity的启动流程很多啊。那我们就来看看吧。个人感觉这类文章代码细节太多&#xff0c;反而容易迷失在源码调用之中&#xff0c;从而忽略了Activity启动过程的本质。所以本文就简单地定性地对Activity启动过程进行描述&#xff0c;不会贴上大…

微软的Copilot for Sales(销售助手)和Copilot for Service(服务助手)现已全面开放

深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领域的领跑者。点击订阅&#xff0c;与未来同行&#xff01; 订阅&#xff1a;https://rengongzhineng.io/ 。 微…

Redis 的持久化机制是什么?各自的优缺点?

Redis 提供两种持久化机制 RDB&#xff08;默认&#xff09; 和 AOF 机制: RDB&#xff1a;是Redis DataBase缩写快照 RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中&#xff0c;对应产生的数据文件为dump.rdb。通过配置文件中的save参数来…

vulhub中Adminer ElasticSearch 和 ClickHouse 错误页面SSRF漏洞复现(CVE-2021-21311)

Adminer是一个PHP编写的开源数据库管理工具&#xff0c;支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL、Oracle、Elasticsearch、MongoDB等数据库。 在其4.0.0到4.7.9版本之间&#xff0c;连接 ElasticSearch 和 ClickHouse 数据库时存在一处服务端请求伪造漏洞&#xff08…

【PCL】(九)点云体素下采样

&#xff08;九&#xff09;Filtering 体素下采样 点云样例&#xff1a; https://raw.github.com/PointCloudLibrary/data/master/tutorials/table_scene_lms400.pcd 以下程序实现对读取的点云进行体素下采样&#xff0c;并将得到的点云保存。 voxel_grid.cpp #include <…

Web APIs 1 DOM操作

Web APIs 1 引入&#xff1a;const优先Web API 基本认知01 作用和分类02 什么是DOM03 DOM树04 DOM对象 获取DOM对象01 根据CSS选择器获取02 其他获取DOM元素方法 操作元素内容01 innerText 属性02 innerHTML 属性 操作元素属性操作元素的常用属性操作元素的样式属性操作表单元素…

FPGA项目(15)——基于FPGA的DDS信号发生器

1.相关概念 DDS&#xff08;Direct Digital Synthesis&#xff0c;直接数字合成&#xff09;是一种通过数字技术生成精确频率和相位可调的信号的方法。它基于数字时钟和数值控制的方式&#xff0c;通过累加器、相位累积器和查表器等组件&#xff0c;以数字方式实现信号的频率和…

RK35x8-RTC(RX8025T)驱动加载

RTC芯片简介 RX8025-T是EPSON 推出的一款拥有I2C接口和温度补偿功能的新型实时时钟芯片&#xff0c;内部集成32.768KHz温度补偿晶体振荡器&#xff0c;可用于各种需要高精度时钟的场合。通过设置相应补偿的控制位&#xff0c;可以实现不同间隔的温度补偿功能&#xff0c;从而大…

聊聊并发编程,另送5本Golang并发编程新书

大家好&#xff0c;我是飞哥&#xff01; 并发编程并不是一个新话题&#xff0c;但是我觉得在近几年以及未来的时间里&#xff0c;并发编程将显得越来越重要。 为什么这样讲&#xff0c;让我们先回到一个基本的问题上来&#xff0c;为什么我们要采用并发编程&#xff1f;关于这…

Gson源码解读

一&#xff0c;概述 gson作为流行的json工具&#xff0c;笔者使用较多。本文主要目的是解读下Gson的源码实现&#xff0c;就没有然后了。 二&#xff0c;实例 实例如下图所示&#xff0c;笔者简单调用gson的toJson方法获得json字符串&#xff0c;fromJson则从json字符串解析…