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

五、回溯(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)复杂度分析

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

相关文章:

  • 什么是分布式锁?他解决了什么样的问题?
  • Ubuntu 12.04增加右键命令:在终端中打开增加打开文件
  • Centos 7 访问局域网windows共享文件夹
  • GDB的TUI模式(文本界面)
  • 深入了解Python和OpenCV:图像的卡通风格化
  • 【算法挨揍日记】day06——1004. 最大连续1的个数 III、1658. 将 x 减到 0 的最小操作数
  • 华为云HECS安装docker
  • 力扣669 补9.16
  • 2023-9-22 没有上司的舞会
  • 【HDFS】cachingStrategy的设置
  • 性能测试 —— 性能测试常见的测试指标 !
  • 【学习草稿】背包问题
  • doxygen c++ 语法
  • ChatGLM微调基于P-Tuning/LoRA/Full parameter(上)
  • BLE Mesh蓝牙mesh传输大数据包传输文件照片等大数据量通讯
  • 9.18 QT作业
  • 【100天精通Python】Day67:Python可视化_Matplotlib 绘动画,2D、3D 动画 示例+代码
  • Linux内核源码分析 (B.x)Linux页表的映射
  • 机器学习(15)---代价函数、损失函数和目标函数详解
  • 计算机专业大学规划之双非
  • 2.策略模式
  • 算法通过村第七关-树(递归/二叉树遍历)黄金笔记|迭代遍历
  • MySQL数据库简介+库表管理操作+数据库用户管理
  • PyTorch实战:卷积神经网络详解+Python实现卷积神经网络Cifar10彩色图片分类
  • MapRdeuce工作原理
  • 完整指南:使用JavaScript从零开始构建中国象棋游戏
  • PG-DBA培训19:PostgreSQL高可用集群项目实战之Patroni
  • 数据库管理-第105期 安装Database Valut组件(20230919)
  • 企望制造ERP系统RCE漏洞 复现
  • 【unity小技巧】Unity 存储存档保存——PlayerPrefs、JsonUtility和MySQL数据库的使用