当前位置: 首页 > news >正文

代码随想录算法训练营Day22 | Leetcode 77 组合 Leetcode 216 组合总和Ⅲ Leetcode17 电话号码的字母组合

前言

回溯算法中递归的逻辑不重要,只要掌握回溯的模板以及将问题转化为树形图,整个问题就很好解决了,比二叉树简单。

 Leetcode 77 组合

题目链接:77. 组合 - 力扣(LeetCode)

代码随想录题解:代码随想录 (programmercarl.com)

思路:套回溯的模板,终止条件是path==k。然后将题目描述的组合逻辑想象成树形结构

代码:

class Solution {
public:vector<int> path;vector<vector<int>>res;void backtracking(int n,int k, int index){if(path.size()==k)//终止条件{res.push_back(path);return;}for(int i=index;i<=n;i++)树形结构逻辑{path.push_back(i);backtracking(n, k, i+1);path.pop_back();回溯}return;}vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return res;}
};

Leetcode 216 组合总和Ⅲ

题目链接:216. 组合总和 III - 力扣(LeetCode)

代码随想录题解:代码随想录 (programmercarl.com)

思路:这个题和上一道题唯一的区别就是终止条件加了一个和等于目标值,树形结构基本没变

代码:

class Solution {
public:vector<int> path;vector<vector<int>>res;int sum=0;void backtracking(int k,int n,int index){if(sum==n&&path.size()==k)//终止条件{res.push_back(path);return;}for(int i=index;i<=9;i++)树形结构逻辑{path.push_back(i);sum+=i;backtracking(k, n, i+1);sum-=i;//回溯path.pop_back();}return;}    vector<vector<int>> combinationSum3(int k, int n) {backtracking(k, n, 1);return res;}
};

Leetcode17 电话号码的字母组合

题目链接:17. 电话号码的字母组合 - 力扣(LeetCode)

代码随想录题解:代码随想录 (programmercarl.com)

思路:这道题目的终止条件和上面三道题几乎一样,只不过树形逻辑要通过一个二维字符串数组做一个映射。

代码:

class Solution {
public:string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};string path;vector<string> res;void backtracking(string a,int index){if(path.size()==a.size())//终止条件{res.push_back(path);return;}int digit=a[index]-'0';//映射string letter=letterMap[digit];for(int i=0;i<letter.size();i++)//树形结构逻辑{path.push_back(letter[i]);backtracking(a, index+1);path.pop_back();//回溯}return;}vector<string> letterCombinations(string digits) {if(digits.size()==0){return res;}backtracking(digits, 0);return res;}};

总结

求解回溯模板需要想好终止条件以及树形逻辑的代码编写,不需要仔细思考递归逻辑,相比于二叉树的各种遍历简单许多。

http://www.lryc.cn/news/417508.html

相关文章:

  • 【微信小程序实战教程】之微信小程序中的 JavaScript
  • K-近邻算法(一)
  • 从零开始之AI视频制作篇
  • Java之TCP编程综合案例
  • 【数据分析---Pandas实战指南:精通数据查询、增删改操作与高效索引和列名操作管理】
  • Spring Cloud全解析:注册中心之Eureka服务获取和服务续约
  • 三相整流电路交流侧谐波仿真分析及计算
  • 了解Java中的反射,带你如何使用反射
  • 【c++】基础知识——快速入门c++
  • AI学习记录 - 自注意力机制的计算流程图
  • JavaScript快速入门,满满干货总结,快速掌握JS语法,DOM,BOM,事件
  • 【C++】C++入门基础【类与对象】
  • Qt | QScatterSeries 散点图
  • 无缝协作的艺术:Codigger 视频会议(Meeting)的用户体验
  • C基础练习(学生管理系统)
  • 网络安全抓包封包WEB
  • Spring Boot - 在Spring Boot中实现灵活的API版本控制(上)
  • 普中51单片机:DS18B20温度传感器操作指南(十三)
  • 【网络】网络的发展历程及其相关概念
  • 鸿蒙HarmonyOS开发:如何使用第三方库,加速应用开发
  • C++的标准模板库简单介绍
  • 安卓常用控件ListView
  • 优秀的行为验证码的应用场景与行业案例
  • 《程序猿入职必会(10) · SpringBoot3 整合 MyBatis-Plus》
  • 计算机网络408考研 2018
  • (亲测有效)SpringBoot+Vue项目云服务器部署(宝塔)
  • 健康管理系统
  • 【计算机网络】网络基础概念
  • 深入理解Spring的三级缓存机制
  • LSTM长短时记忆网络【数学+图解】