代码随想录笔记--回溯算法篇

1--回溯算法理论基础

        回溯算法本质上是一个暴力搜索的过程,其常用于解决组合切割子集排列等问题,其一般模板如下:

void backTracking(参数){if(终止条件){// 1. 收获结果;// 2. return;}for(..遍历){// 1. 处理节点// 2. 递归搜索// 3. 回溯 // 即撤销对节点的处理}return;
}

2--组合问题

主要思路:

        基于回溯法,暴力枚举 k 个数,需注意回溯弹出元素的操作;

#include <iostream>
#include <vector>class Solution {
public:std::vector<std::vector<int>> combine(int n, int k) {std::vector<int> path;backTracking(n, k, path, 1); // 从第 1 个数开始return res;}void backTracking(int n, int k, std::vector<int> path, int start){if(path.size() == k){res.push_back(path);return;}for(int i = start; i <= n; i++){path.push_back(i);backTracking(n, k, path, i + 1); // 递归暴力搜索下一个数path.pop_back(); // 回溯}}private:std::vector<std::vector<int>> res;
};int main(int argc, char* argv[]){int n = 4, k = 2;Solution S1;std::vector<std::vector<int>> res = S1.combine(n, k);for(auto v : res){for(int item : v) std::cout << item << " ";std::cout << std::endl;}return 0;
}

3--组合问题的剪枝操作

        上题的组合问题中,对于进入循环体 for(int i = start; i <= n; i++):

已选择的元素数量为:path.size()

仍然所需的元素数量为:k - path.size()

剩余的元素集合为:n - i + 1

则为了满足要求,必须满足:k-path.size() <= n - i + 1,即 i <= n - k + path.size() + 1

因此,可以通过以下条件完成剪枝操作:

for(int i = start; i <= i <= n - k + path.size() + 1; i++)

#include <iostream>
#include <vector>class Solution {
public:std::vector<std::vector<int>> combine(int n, int k) {std::vector<int> path;backTracking(n, k, path, 1); // 从第 1 个数开始return res;}void backTracking(int n, int k, std::vector<int> path, int start){if(path.size() == k){res.push_back(path);return;}for(int i = start; i <= n - k + path.size() + 1; i++){path.push_back(i);backTracking(n, k, path, i + 1); // 暴力下一个数path.pop_back(); // 回溯}}private:std::vector<std::vector<int>> res;
};int main(int argc, char* argv[]){int n = 4, k = 2;Solution S1;std::vector<std::vector<int>> res = S1.combine(n, k);for(auto v : res){for(int item : v) std::cout << item << " ";std::cout << std::endl;}return 0;
}

4--组合总和III

主要思路:

        类似于上面的组合问题,基于回溯来暴力枚举每一个数,需要注意剪枝操作;

#include <iostream>
#include <vector>class Solution {
public:std::vector<std::vector<int>> combinationSum3(int k, int n) {std::vector<int> path;backTracking(k, n, 0, path, 1);return res;}void backTracking(int k, int n, int sum, std::vector<int>path, int start){if(sum > n) return; // 剪枝if(path.size() == k){ // 递归终止if(sum == n){res.push_back(path);}return;}for(int i = start; i <= 9 + path.size() - k + 1; i++){ // 剪枝path.push_back(i);sum += i;backTracking(k, n, sum, path, i + 1); // 递归枚举下一个数// 回溯sum -= i;path.pop_back();}}
private:std::vector<std::vector<int>> res;
};int main(int argc, char* argv[]){int k = 3, n = 7;Solution S1;std::vector<std::vector<int>> res = S1.combinationSum3(k, n);for(auto v : res){for(int item : v) std::cout << item << " ";std::cout << std::endl;}return 0;
}

5--电话号码的字母组合

主要思路:

        

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

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

相关文章

Jmeter常用功能-参数化介绍

JMeter也有像LR中的参数化&#xff0c;本篇就来介绍下JMeter的参数化如何去实现。 参数化&#xff1a;录制脚本中有登录操作&#xff0c;需要输入用户名和密码&#xff0c;假如系统不允许相同的用户名和密码同时登录&#xff0c;或者想更好的模拟多个用户来登录系统。 这个时…

LeetCode刷题笔记【24】:贪心算法专题-2(买卖股票的最佳时机II、跳跃游戏、跳跃游戏II)

文章目录 前置知识122.买卖股票的最佳时机II题目描述贪心-直观写法贪心-优化代码更简洁 55. 跳跃游戏题目描述贪心-借助ability数组贪心-只用int far记录最远距离 45.跳跃游戏II题目描述回溯算法贪心算法 总结 前置知识 参考前文 参考文章&#xff1a; LeetCode刷题笔记【23】…

98. 验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 1&#xff1a; 输入&am…

(十一)人工智能应用--深度学习原理与实战--实现泰坦尼克号生存者预测案例Titanic Survival

泰坦尼克号生存者预测(Titanic Survival)是谷歌Kaggle人工智能大赛中的经典亲例。本任务要求根据给定的1300余位乘客的特征(姓名、性别、年龄、舱位等】及幸存情况(0-死亡,1-幸存】建立神经网络模型,能够较巿准确地预测测试集中乘客的幸存情况。 主要流程为: 数据的导人及预…

MyBatis-Plus学习笔记总结

一、查询 构造器分为QueryWrapper和LambdaQueryWrapper 创建实体类User package com.system.mybatisplus.model;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.…

既然有 HTTP 协议,为什么还要有 RPC

HTTP和RPC 什么是HTTP HTTP协议&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff0c;又叫做超文本传输协议。平时上网在浏览器上敲个网址就能访问网页&#xff0c;这里用到的就是HTTP协议。 什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;&…

数据结构 - 双向链表

文章目录 目录 文章目录 前言 一、什么是双向链表? 双向链表有什么优势? 二、双向链表的设计和实现 1.设计思想 尾增 : 在链表的末尾添加新的元素 头插 : 在链表头部插入节点 删除 : 根据val的值删除节点 查找 : 根据索引的值查找并返回节点 总结 前言 大家好,今天给…

Vue的props配置项

简介&#xff1a;Vue中的组件模板是可以复用的&#xff0c;但是模板中的数据是可以改变的。props配置项用于解决组件迁移复用时接受和保存传递给组件的数据的问题。 1.如何给组件传递数据&#xff1f; 答&#xff1a;按照key:value的形式进行传递。 2.如何保存传递给组件的数…

站在AI大模型十字路口:实地探访2023服贸会

服贸会恰是一面镜子。小到针对蓝领市场的刷脸招聘机器&#xff0c;大到向政企展示的生活服务数据监测平台&#xff0c;无一不在折射出&#xff0c;中国的数字化服务已渗透到个人生活与企业管理的方方面面。 作者|思杭 出品|产业家 处暑过后的北京&#xff0c;仍留着夏天些…

buuctf web 前5题

目录 一、[极客大挑战 2019]EasySQL 总结&#xff1a; 二、[极客大挑战 2019]Havefun 总结&#xff1a; 三、[HCTF 2018]WarmUp 总论&#xff1a; 四、[ACTF2020 新生赛]Include 总结&#xff1a; 五、[ACTF2020 新生赛]Exec 总结&#xff1a; 一、[极客大挑战 2019]…

手写Spring:第11章-容器事件和事件监听器

文章目录 一、目标&#xff1a;容器事件和事件监听器二、设计&#xff1a;容器事件和事件监听器三、实现&#xff1a;容器事件和事件监听器3.1 工程结构3.2 容器事件和事件监听器类图3.3 定义和实现事件3.3.1 定义事件抽象类3.3.2 定义应用上下文事件实现类3.3.3 上下文刷新事件…

视频导出文件太大如何变小?缩小视频这样做

作为一名视频制作爱好者&#xff0c;我们经常需要导出视频文件&#xff0c;但是&#xff0c;有时候我们会发现导出的视频文件太大&#xff0c;给上传和分享带来很大的不便。那么&#xff0c;如何将视频文件变小呢&#xff1f;下面将为你介绍三个方法&#xff0c;让你轻松解决视…