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

(C++回溯01) 组合

77、组合

回溯题目三步走

1. 确定参数

2. 确定终止条件

3. for 循环横向遍历,递归纵向遍历

class Solution {
public: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();}}vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return result;}
};

剪枝操作:

公式:n - (k - path.size()) + 1

k - path.size() 意思是还可选取多少元素

n - (k - path.size()) 意思是去掉可选取元素个数后的位置

n - (k - path.size()) + 1 为当前可以组合的最后一个位置

剪枝后代码:

class Solution {
public: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++) {int flag = n - (k - path.size()) + 1;if(i > flag) {return;}path.push_back(i);backtracking(n, k, i + 1);path.pop_back();}}vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return result;}
};

216、组合总和 III

class Solution {
public:vector<vector<int>> result;vector<int> path;int count = 0;void backtracking(int k, int n, int startIndex) {if(path.size() == k) {if(count == n)result.push_back(path);return;}for(int i = startIndex; i < 10; i++) {path.push_back(i);count += i;backtracking(k, n, i + 1);path.pop_back();count -= i;}}vector<vector<int>> combinationSum3(int k, int n) {backtracking(k, n, 1);return result;}
};

剪枝操作:

class Solution {
public:vector<vector<int>> result;vector<int> path;int count = 0;void backtracking(int k, int n, int startIndex) {if(path.size() == k) {if(count == n)result.push_back(path);return;}for(int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {count += i;if(count > n) {count -= i;return;}path.push_back(i);backtracking(k, n, i + 1);path.pop_back();count -= i;}}vector<vector<int>> combinationSum3(int k, int n) {backtracking(k, n, 1);return result;}
};

17、电话号码的字母组合

class Solution {
private:string letterMap[10] = {"","","abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9};
public:vector<string> result;string path;void backtacking(string& digits, int index) {if(index == digits.size()) {result.push_back(path);return;}string letters = letterMap[digits[index] - '0'];for(int i = 0; i < letters.size(); i++) {path.push_back(letters[i]);backtacking(digits, index + 1);path.pop_back();}}vector<string> letterCombinations(string digits) {if(digits.size() == 0) {return result;}backtacking(digits, 0);return result;}
};

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

相关文章:

  • k8s学习笔记——安装istio的仪表盘之prometheus安装
  • 四、GD32 MCU 常见外设介绍 (7) 7.I2C 模块介绍
  • Apollo 配置中心的部署与使用经验
  • Perl中的设计模式革新:命令模式的实现与应用
  • Java8-求两个集合取交集
  • 爬虫学习4:爬取王者荣耀技能信息
  • 在Ubuntu 14.04上安装和使用Memcache的方法
  • PCDN技术如何降低运营成本?
  • 服务器数据恢复—V7000存储硬盘故障脱机的数据恢复案例
  • BSV区块链在人工智能时代的数字化转型中的角色
  • android audio 相机按键音:(二)加载与修改
  • Linux grep技巧 提取log中的json数据
  • HDShredder 7 企业版案例分享: 依照国际权威标准,安全清除企业数据
  • centos系统使用mysqldump数据备份与恢复
  • 【element ui】input输入控件绑定粘贴事件,从 Excel 复制的数据粘贴到输入框(el-input)时自动转换为逗号分隔的数据
  • Chapter18 基于物理的渲染——Shader入门精要学习
  • DolphinScheduler学习
  • 我用Tauri开发的待办效率工具开源了!
  • 【黑科技】:Laravel 项目性能提升 20 倍
  • User Allocation In MEC: A DRL Approach 论文笔记
  • leetcode 69. x 的平方根
  • 基于词级ngram的词袋模型对twitter数据进行情感分析
  • Linux-Centos-改密码(单用户登陆)
  • java实现OCR图片识别,RapidOcr开源免费
  • PCB工艺边设计准则
  • CTF-NSSCTF题单[GKCTF2020]
  • redis的分片集群(仅供自己参考)
  • 自动驾驶-机器人-slam-定位面经和面试知识系列01之常考公式推导(01)
  • netty入门-5 ServerBootstrap与Bootstarp
  • JavaEE - Spring Boot 简介