代码随想录day25 回溯算法加强练习

216.组合总和III

题目

找出所有相加之和为 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]]

思考

这题其实和组合那一题很像,不同的点是把n变成了9,本题中的n其实对应的是函数入参中的sum,这个至关重要,我也是卡在了这里,其实只要传一个参数sum,然后在纵向递归for循环时不停加这个sum就行,中止条件也是sum==n时,res会push_back path.

代码

class Solution {

public:

    vector<vector<int>> res;

    vector<int> path;

    void backTracking(int k, int n, int startIndex, int sum) {

        if(path.size() == k) {

            if(sum == n) {//中止有两个条件,path的size等于k,相加之和等于n

                res.push_back(path);

                return;

            }

        }

        for(int j = startIndex; j <= 9; j++) {

            sum += j;

            path.push_back(j);

            backTracking(k,n,j+1,sum);

            sum -= j;//回溯时要弹出元素,所以sum要减j,此时的j等于startIndex

            path.pop_back();

        }

    }

    vector<vector<int>> combinationSum3(int k, int n) {

        backTracking(k,n,1,0);

        return res;

    }

};

17.电话号码的字母组合

题目

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

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

17.电话号码的字母组合

示例:

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

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

思考

这题其实不难,就是有点烦,其实用的还是组合那一题的逻辑,但是有些许不同,下面总结步骤如下:

1、要把数字和字母表给对应起来,怎么对应呢,用一个string数组或者vector<string>来存放:{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"},然后每个数字就相当于数组里的下标

2、根据1我们可以看出,这里每个数字都代表一个集合,和组合题目不一样,所以这题不需要清除重复项,没有startIndex,参数里只需要有一个index表示遍历到那个数字了即可

3、判断中止条件,这里可以判断index == digits.size() ,也可以当path.lenth == digits.size()

4、找到digits里每个数字对应的字符串

5、横向遍历,注意这里其实就是遍历每个数字对应字符串里的字符,因为path是由digits每个数字对应的字符串取一个字符组成的

6、纵向遍历,递归向下遍历,每个数字对应的字符串取一个字符

7、回溯,path.pop_back()

代码

class Solution {

private:

    const string lettersMap[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};

public:

    vector<string> res;

    string path;

    void backtTracking(int k, const string& digits, int index) {

        if(path.length() == k) {

            res.push_back(path);

            return;

        }

        int digit = digits[index] - '0';//把字符串digit每一个字符都转化成数字

        string letters = lettersMap[digit];//if digit == 2, letters = “abc”

        for(int i = 0; i < letters.size(); i++) {//遍历letters,把每一个字符都存入path

            path += letters[i];

            backtTracking(k, digits, index+1);

            path.pop_back();

        }

    }

    vector<string> letterCombinations(string digits) {

        if(digits.size() == 0) return res;

        backtTracking(digits.size(), digits, 0);

        return res;

    }

};

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

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

相关文章

数字信号处理实验---LSI系统的分析 Matlab代码

1.试用Matlab计算其幅频特性和相频特性&#xff0c;并绘图。 代码&#xff1a; n 0:10; %定义采样点n w [0:1:500]*2*pi/500; % [0,pi]轴被分成1002个点 x1 power(0.9*exp(1i*pi/3),n); %定义输入序列 x2 exp(-1i*n); %定义一个系统的冲激响应 x zeros(1,length(w))…

RK3568驱动指南|第十篇 热插拔-第118章 使用udev挂载U盘和T卡实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

Backtrader 文档学习-Strategy with Signals

Backtrader 文档学习-Strategy with Signals backtrader可以不通过重写策略的方式触发交易&#xff0c;尽管重写策略是首选通用的方式。 下面介绍通过使用信号也是可以实现交易触发的。 1.定义signal import backtrader as btdata bt.feeds.OneOfTheFeeds(datanamemydatana…

关于报错 curl: (56) Recv failure: Connection reset by peer

curl ip没问题 curl localhost 则报错 curl: (56) Recv failure: Connection reset by peer 出现这个报错有很多原因, 其中之一就是terminal代理 而关闭代理应用之后, 其实由于配置的终端都是 export指定的代理 所以导致还是一直报错. 通过 curl -v 可以发现 指向了代理ip和…

【HarmonyOS4.0】第八篇-ArkUI系统组件(三)

【HarmonyOS4.0】第七篇-ArkUI系统组件(三) 七、二维码组件 二维码的使用场景&#xff0c;比如扫码添加好友&#xff0c;扫码骑车&#xff0c;扫码支付等等&#xff0c;ArkUI开发框架提供了 RQCode 组件生成一个二维码。 接口&#xff1a; QRCode(value: string)参数: 参数…

一起来了解综合能源服务认证

首先&#xff0c;综合能源服务认证是有国家政策支持的&#xff0c; 《能源生产和消费革命战略&#xff08;2016-2030&#xff09;》中指出:1、能源生产端要以绿色低碳为方向&#xff0c;推动能源集中式和分布式开发并举&#xff0c;大幅提高新能源和可再生能源比重&#xff1b…

【昕宝爸爸小模块】ConcurrentHashMap为什么不允许null值

ConcurrentHashMap为什么不允许null值 一、✅典型解析二、✅要实现一个HashMap怎么做2.1 ✅需要考虑以下几个方面2.2 ✅基于数组和链表的HashMap实现Demo2.3 ✅扩容后如何解决链表长度过长的问题 三、✅拓展知识仓3.1 ✅在多线程环境下如何保证数据的正确性和性能3.2 ✅那如何在…

第3章:python的判断语句

学一门语言&#xff0c;无外乎多敲&#xff0c;多用&#xff0c;记得回顾昨天写过的代码呀 布尔类型和比较运算符 布尔类型的定义 使用比较运算符进行比较运算得到布尔类型的结果 比较运算符 """ 演示布尔类型的定义 以及比较运算符的应用 ​ """…

功能消费迈向精智生活,绿联如何撬动3C数码新增量?

根据行业生命周期理论&#xff0c;当前国产移动数码周边市场俨然已迈入成熟期&#xff0c;相关企业也完成一轮腾飞&#xff0c;正在为新的发展蓄能。 其中&#xff0c;绿联的发展历程可以说是行业进化升级的缩影。产品层面&#xff0c;已完成从“数据线厂商”到专业数码科技公…

nextjs + ahooks 报错 Cannot use import statement outside a module

在 nextjs 中使用 ahooks 时&#xff0c;报错 SyntaxError: Cannot use import statement outside a module&#xff0c;如下图所示&#xff1a; 解决方案 transpilePackages 官网介绍 Next.js can automatically transpile and bundle dependencies from local packages (lik…

Python的安装与卸载【Windows系统】

在 Windows 上安装与卸载 Python Python的安装 下载Python 安装Python 下载完后打开安装包 注意最底下的"Add Python 3.8 to Path"&#xff08;将Python加入环境变量&#xff09;一定要勾选&#xff01;&#xff01;&#xff01;这样就可以免去之后环境配置的烦恼…

用win系统搭建Minecraft世界服务器,MC开服教程,小白开服教程

雨云VPS用Windows系统搭建我的世界世界服务器&#xff0c;Minecraft开服教程&#xff0c;小白开服教程&#xff0c;MC 1.19.4版本服务器搭建教程。 此教程使用 Mohist 1.19.4 服务端&#xff0c;此服务端支持Forge模组和Bukkit/Spigot/Paper插件&#xff0c;如果需要开其他服务…