五、回溯(trackback)
文章目录
- 一、算法定义
- 二、经典例题
- (一)排列
- 1.[46.全排列](https://leetcode.cn/problems/permutations/description/)
- (1)思路
- (2)代码
- (3)复杂度分析
- 2.[LCR 083. 全排列](https://leetcode.cn/problems/VvJkup/description/)
- (1)思路
- (2)代码
- (3)复杂度分析
- (二)组合
- (三)子集
- (四)N皇后问题、岛屿问题
- 1.[51.N皇后](https://leetcode.cn/problems/n-queens/)
- (1)思路
- (2)代码
- (3)复杂度分析
一、算法定义
抽象地说,解决一个回溯问题,实际上就是遍历一棵决策树的过程,树的每个叶子节点存放着一个合法答案。你把整棵树遍历一遍,把叶子节点上的答案都收集起来,就能得到所有的合法答案。
站在回溯树的一个节点上,你只需要思考 3 个问题:
1、路径:也就是已经做出的选择。
2、选择列表:也就是你当前可以做的选择。
3、结束条件:也就是到达决策树底层,无法再做选择的条件。
二、经典例题
(一)排列
1.46.全排列
(1)思路
(2)代码
class Solution {
public:
vector<vector<int>> res;void dfs(vector<int>& nums) {vector<int> path;vector<bool> used(nums.size(),false);trackback(nums,path,used);}void trackback(vector<int>& nums,vector<int>&path,vector<bool>&used) {if (path.size() == nums.size()) {res.push_back(path);return ;}for (int i = 0; i < nums.size(); i ++) {if (used[i] == true) continue;path.push_back(nums[i]);used[i] = true;trackback(nums, path, used);used[i] = false;path.pop_back();}}vector<vector<int>> permute(vector<int>& nums) {if (nums.size() == 0) return res;dfs(nums);return res;}
};
(3)复杂度分析
时间复杂度:O(n x n!)
空间复杂度:O(n),其中n为序列的长度。除答案数组以外,递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,这里可知递归调用深度为 O(n)。
2.LCR 083. 全排列
(1)思路
(2)代码
class Solution {
public:
vector<vector<int>> res;void process(vector<int>& nums) {vector<int> path;vector<bool> used(nums.size(),false);dfs(used,path,nums);}void dfs(vector<bool>& used,vector<int> &path,vector<int>& nums) {if (path.size() == nums.size()){res.push_back(path);return;}for (int i = 0; i < nums.size(); i++) {if (used[i]) continue;path.push_back(nums[i]);used[i] = true;dfs(used,path,nums);used[i] = false;path.pop_back();}}vector<vector<int>> permute(vector<int>& nums) {if (nums.size() == 0) return res;sort(nums.begin(),nums.end());process(nums);return res;}
};
(3)复杂度分析
时间复杂度:O(n x n!)
空间复杂度:O(n)
(二)组合
(三)子集
(四)N皇后问题、岛屿问题
1.51.N皇后
(1)思路
(2)代码
class Solution {
public:
vector<vector<string>> res;vector<vector<string>> solveNQueens(int n) {vector<string> board (n,string(n,'.'));backtrack(board,0);return res;}void backtrack(vector<string>& board, int row) {if (row == board.size()) {res.push_back(board);return;}int n = board[row].size();for (int col = 0; col < n; col++) {if (!isvaild(board,row,col)) {continue;}board[row][col] = 'Q';backtrack(board, row + 1);// 撤销选择board[row][col] = '.';}}bool isvaild(vector<string>& board, int row, int col) {int n = board.size();for (int i = 0; i <= row; i++) {if (board[i][col] == 'Q')return false;}for (int i = row - 1,j = col + 1; i >= 0 && j < n;i --,j ++) { // 左上if (board[i][j] == 'Q')return false;}for (int i = row - 1, j = col - 1;i >= 0 && j >= 0; i--, j--) { // 右上if (board[i][j] == 'Q')return false;}return true;}
};
(3)复杂度分析
相关文章:
五、回溯(trackback)
文章目录 一、算法定义二、经典例题(一)排列1.[46.全排列](https://leetcode.cn/problems/permutations/description/)(1)思路(2)代码(3)复杂度分析 2.[LCR 083. 全排列](https://le…...
什么是分布式锁?他解决了什么样的问题?
相信对于朋友们来说,锁这个东西已经非常熟悉了,在说分布式锁之前,我们来聊聊单体应用时候的本地锁,这个锁很多小伙伴都会用 ✔本地锁 我们在开发单体应用的时候,为了保证多个线程并发访问公共资源的时候,…...
Ubuntu 12.04增加右键命令:在终端中打开增加打开文件
Ubuntu 12.04增加右键命令:在终端中打开 软件中心:搜索nautilus-open-terminal安装 用快捷键CtrlT打开命令行输入: sudo apt-get install nautilus-open-terminal 重新加载文件管理器 nautilus -q 或注销再登录即要使用...
Centos 7 访问局域网windows共享文件夹
Refer: centos7 访问windows系统的共享文件夹_centos访问windows共享_三希的博客-CSDN博客 一、在CentOS中配置CIFS网络存储服务 CIFS(Common Internet File System)是一种在网络上共享文件的协议,也称为SMB(Server Message Blo…...
GDB的TUI模式(文本界面)
2023年9月22日,周五晚上 今晚在看GDB的官方文档时,发现GDB居然有文本界面模式 TUI (Debugging with GDB) (sourceware.org) GDB开启TUI的条件 GDB的文本界面的开启条件是:操作系统有适当版本的curses库 The TUI mode is supported only on…...
深入了解Python和OpenCV:图像的卡通风格化
前言 当今数字时代,图像处理和美化已经变得非常普遍。从社交媒体到个人博客,人们都渴望分享独特且引人注目的图片。本文将介绍如何使用Python编程语言和OpenCV库创建令人印象深刻的卡通风格图像。卡通风格的图像具有艺术性和创意,它们可以用…...
【算法挨揍日记】day06——1004. 最大连续1的个数 III、1658. 将 x 减到 0 的最小操作数
1004. 最大连续1的个数 III 1004. 最大连续1的个数 III 题目描述: 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。 解题思路: 首先题目要我们求出的最多翻转k个0后&#x…...
华为云HECS安装docker
1、运行安装指令 yum install docker都选择y,直到安装成功 2、查看是否安装成功 运行版本查看指令,显示docker版本,证明安装成功 docker --version 或者 docker -v 3、启用并运行docker 3.1启用docker 指令 systemctl enable docker …...
力扣669 补9.16
最近大三上四天有早八,真的是受不了了啊,欧嗨呦,早上困如狗,然后,下午困如狗,然后晚上困如狗,尤其我最近在晚上7点到10点这个时间段看力扣,看得我昏昏欲睡,不自觉就睡了1…...
2023-9-22 没有上司的舞会
题目链接:没有上司的舞会 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 6010;int n; int happy[N]; int h[N], e[N], ne[N], idx; bool has_father[N];// 两个状态,选该节点或不选该…...
【HDFS】cachingStrategy的设置
org.apache.hadoop.hdfs.client.impl.BlockReaderFactory#getRemoteBlockReader: private BlockReader getRemoteBlockReader(Peer peer) throws IOException {int networkDistance = clientContext.getNetworkDistance(datanode);return BlockReaderRemote...
性能测试 —— 性能测试常见的测试指标 !
一、什么是性能测试 先看下百度百科对它的定义,性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 我们可以认为性能测试是:通过在测试环境下对系统或构件的性能进行探测,用以验证在生产环…...
【学习草稿】背包问题
一、01背包问题 图解详细解析 (转载) https://blog.csdn.net/qq_37767455/article/details/99086678 :Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物…...
doxygen c++ 语法
c基本语法模板 以 /*! 开头, */ 结尾 /*!\关键字1\关键字2 */1 文件头部信息 /*! \file ClassA.h* \brief 文件说明 定义了类fatherA* \details This class is used to demonstrate a number of section commands.* \author John Doe* \author Jan Doe* \v…...
ChatGLM微调基于P-Tuning/LoRA/Full parameter(上)
1. 准备环境 首先必须有7个G的显存以上,torch >= 1.10 需要根据你的cuda版本 1.1 模型下载 $ git lfs install $ git clone https://huggingface.co/THUDM/chatglm-6b1.2 docker环境搭建 环境搭建 $ sudo docker pull slpcat/chatglm-6b:latest $ sudo docker run -it …...
BLE Mesh蓝牙mesh传输大数据包传输文件照片等大数据量通讯
1、BLE Mesh数据传输现状 BLE Mesh网络技术是低功耗蓝牙的一个进阶版,Mesh扩大了蓝牙在应用中的规模和范围,因为它同时支持超过三万个网络节点,可以跨越大型建筑物,不仅可以使得医疗健康应用更加方便快捷,还能监测像学…...
9.18 QT作业
mainwindow.h QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWindow();signals:void jump(); //自定义跳转信号函数private slots:vo…...
【100天精通Python】Day67:Python可视化_Matplotlib 绘动画,2D、3D 动画 示例+代码
1 绘制2D动画(animation) Matplotlib是一个Python绘图库,它提供了丰富的绘图功能,包括绘制动画。要绘制动画,Matplotlib提供了FuncAnimation类,允许您创建基于函数的动画。下面是一个详细的Matplotlib动画示…...
Linux内核源码分析 (B.x)Linux页表的映射
Linux内核源码分析 (B.x)Linux页表的映射 文章目录 Linux内核源码分析 (B.x)Linux页表的映射一、ARM32页表1、页表术语2、虚拟地址到物理地址转换3、一级页表项4、二级页表项 二、ARM64页表1、ARMv8-A架构2、4KB大小页4级映射 三、Linux内核中关于页表的函数和宏1、查询页表2、…...
机器学习(15)---代价函数、损失函数和目标函数详解
文章目录 一、各自定义二、各自详解三、代价函数和损失函数区别四、例题理解 一、各自定义 1. 代价函数:代价函数(Cost Function)是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均。它用于衡量模型在…...
计算机专业大学规划之双非
亲爱的计算机专业大一学弟学妹们,欢迎来到充满挑战和机遇的大学校园!在经历了小半年的大学生活后,是否会对自己的未来感到一些迷茫,借着前几天给我大一的妹妹聊天的机会,我想发表一下关于我的建议(仅限个…...
2.策略模式
UML图 代码 main.cpp #include "Strategy.h" #include "Context.h"void test() {Context* pContext nullptr;/* StrategyA */pContext new Context(new StrategyA());pContext->contextInterface();/* StrategyB */pContext new Context(new Strat…...
算法通过村第七关-树(递归/二叉树遍历)黄金笔记|迭代遍历
文章目录 前言1. 迭代法实现前序遍历2. 迭代法实现中序遍历3. 迭代法实现后序遍历总结 前言 提示:在一个信息爆炸却多半无用的世界,清晰的见解就成了一种力量。 --尤瓦尔赫拉利《今日简史》 你是不是觉得上一关特别简单,代码少,背…...
MySQL数据库简介+库表管理操作+数据库用户管理
Mysql Part 1 一、数据库的基本概念1.1 使用数据库的必要性1.2 数据库基本概念1.2.1 数据(Data)1.2.2 表1.2.3 数据库1.2.4 数据库管理系统(DBMS)1.2.5 数据库系统 1.3 数据库的分类1.3.1 关系数据库 SQL1.3.2 非关系数据库 NoSQL…...
PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类
目录 前言 一、卷积神经网络概述 二、卷积神经网络特点 卷积运算 单通道,二维卷积运算示例 单通道,二维,带偏置的卷积示例 带填充的单通道,二维卷积运算示例 Valid卷积 Same卷积 多通道卷积计算 1.局部感知域 2.参数共…...
MapRdeuce工作原理
hadoop - (三)通俗易懂地理解MapReduce的工作原理 - 个人文章 - SegmentFault 思否 MapReduce架构 MapReduce执行过程 Map和Reduce工作流程 (input) ->map-> ->combine-> ->reduce-> (output) Map: Reduce...
完整指南:使用JavaScript从零开始构建中国象棋游戏
引言 中国象棋,又被称为国际象棋,是一款起源于中国的古老棋类游戏。本文旨在为大家提供一个简单明了的步骤,教你如何使用JavaScript从零开始构建这款经典的棋类游戏。 1. 游戏简介 在中国象棋中,两方各有一军队,包括…...
PG-DBA培训19:PostgreSQL高可用集群项目实战之Patroni
一、风哥PG-DBA培训19:PostgreSQL高可用集群项目实战之Patroni 课程目标: 本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL主从复制与高可用集群阶段之PostgreSQL高可用集群项目实战之Patroni,学完本课…...
数据库管理-第105期 安装Database Valut组件(20230919)
数据库管理-第105期 安装Database Valut组件(20230919) 之前无论是是EXPDP还是PDB中遇到的一些问题,其实都跟数据库的DV(Database Valut)组件有关,因为目标库没有安装DV导致启动时会出现问题。 1 DV/OLS …...
企望制造ERP系统RCE漏洞 复现
文章目录 企望制造ERP系统RCE漏洞 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 企望制造ERP系统RCE漏洞 复现 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播…...
上海网站建设工作/站长之家域名查询官网
反射技术学习笔记 文章目录反射技术学习笔记一、反射介绍1.什么是反射2.反射的作用二、创建对象过程1.创建 Java 对象的三个阶段2.创建对象时内存结构三、获取Class对象的三种方式1.通过getClass()方法获取Class对象2.通过.class静态属性获取Class对象3.通过Class.forName(&quo…...
wp网站搬家教程/百度账号快速注册入口
从Java 5 开始引入了静态导入语法(import static)使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。package cn.itcast.p6.staticimport;import java.util.*; import static java.uti…...
杭seo网站建设排名/佛山优化网站关键词
无论你如何将Hadoop与Spark进行对比,无论Spark生态多么成熟和完善,其底层终归要基于HDFS,毕竟这是目前最成熟的分布式底层文件系统,几乎没有哪家公司愿意重新花费精力研发一个全新的文件系统。本文将讨论Hadoop分布式文件系统(HDF…...
广州 企业网站建设/互联网营销方案策划
在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。 返回直…...
网站关键词优化wang/seo引擎优化是做什么的
为什么80%的码农都做不了架构师?>>> 简单说说吧:我俩当年都是中兴15年那一批次的应届入职毕业生,一起参加入职公司级别的培训,一个班,一个小组。培训长达7天,无脑级别的洗脑(你懂的…...
wordpress底部CSS/app推广平台
据统计,全球范围内被投递的钓鱼邮件每天约达到1亿封,经常会遇到一些邮件发送方,被spammer利用于伪造各种钓鱼/诈骗邮件,如:伪造银行、保险等金融企业,支付宝、Paypal等支付商,知名网站、政府网站…...