五、回溯(trackback)

2023-09-22 10:17:37

一、算法定义

抽象地说,解决一个回溯问题,实际上就是遍历一棵决策树的过程,树的每个叶子节点存放着一个合法答案。你把整棵树遍历一遍,把叶子节点上的答案都收集起来,就能得到所有的合法答案。
站在回溯树的一个节点上,你只需要思考 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)复杂度分析

更多推荐

黑五如何大卖?TikTok三大类目已抢跑,业绩翻倍指南请查收!

备战旺季,TikTok跨境电商年度最大规模的黑五来了!此次黑五首次覆盖美国,加之上周刚刚发生的"美区全闭环事件",美国已顺势成为当下跨境电商人最为关注的“新火赛道”。另外据TikTokShop官方透露,此次黑五还汇聚英国、沙特等地区资源,市场空间巨大。所以很多商家都在问:如何发力抢占黑五商机?什么品最有可能成为爆品?营

可视化大屏报表的设计与制作 | 附成果图

大屏可视化报表是一种以大屏幕为展示媒介,通过图形、图表、文字等多种方式将数据信息呈现出来的报表形式。它具有视觉冲击力强、信息量大、交互性高等特点,能够帮助企业快速获取数据背后的价值和洞见,提高决策效率。因此近年来,大屏可视化报表越来越受企业青睐。然而,大屏可视化报表的设计与制作并非易事,需要克服诸多难点和挑战。例如,如

pytroch 颜色增强ColorJitter,墙裂推荐

目录函数参数解释:随机亮度测试,非常方便,墙裂推荐:单项测试:举例:yolov5颜色增强示例,效果差不多,opencv的:函数参数解释:函数名:torchvision.transforms.ColorJitter(brightness=0,contrast=0,saturation=0,hue=0)函数解析:随机改变一

2023华为杯E题:出血性脑卒中临床智能诊疗建模

文章目录一、背景介绍二、数据集介绍及建模目标第一题:血肿扩张风险相关因素探索建模。第一问第二问第二题:血肿周围水肿的发生及进展建模,并探索治疗干预和水肿进展的关联关系第一问第二问第三问第四问第三题:出血性脑卒中患者预后预测及关键因素探索第一问第二问第三问附件代码免费获取方式一、背景介绍一堆介绍,了解下我们为何要做这个研

企业电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

功能描述1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看所有的立项信息。主要功能包含:招标立项申请、非招标立项申请、采购立项管理。3、采购项目管理:可对项目采购过程全流程管

HCL Domino LEAP与新的软件下载门户站点

大家好,才是真的好。还记得DominoVolt吗?是的,我前面花了不少时间来讲基于Domino平台上的低代码开发工具Volt,不下十篇,我记得最后一篇是《DominoVolt1.0.5中的可视化流程设计器》。结果就在去年11月,HCL将该该工具重新命名为HCLDominoLeap,可能是为了避免和HCL最近热推的Vol

【工作】-处理快速切换 Tab 导致列表数据不正确的情况

采取以下方案来解决:取消之前的请求:在切换到新的Tab之前,首先检查是否有之前的请求正在进行中。如果是,可以使用取消请求的机制中止之前的请求,以确保不会更新当前Tab的数据。你可以使用类似Axios提供的canceltoken来取消请求。防止并发请求:为了避免并发请求导致数据不正确,你可以在发起新请求之前添加一个标记来

视觉设计师提升自己能力的经验优漫动游

1、业余时间视觉设计师提升自己能力的经验还经常听到一种抱怨”产品有限制,我所擅长发挥不出来”,这样无疑是把自己的设计专业成长寄托在产品上。认为产品不成功自己的设计就不能成长。这其实是个借口。其实面对这个问题,最好的办法就是把设计分2条线:1.项目线:公司的实际产品项目,理解并按照实际情况,满足产品设计需求并达到公司要求

Flask框架-2-[单聊]: flask-socketio实现websocket的功能,实现单对单聊天,flask实现单聊功能

一、概述和项目结构在使用flask-socketio实现单聊时,需要将会话id(sid)与用户进行绑定,通过emit('事件','消息',to=sid),就可以把消息单独发送给某个用户了。flask_websocket|--static|--js|--jquery-3.7.0.min.js|--socket.io_4.

基于STM32设计的校园一卡通(设计配套的手机APP)

一、功能介绍【1】项目介绍随着信息技术的不断发展,校园一卡通作为一种高效便捷的管理方式,已经得到了广泛的应用。而其核心部件——智能卡也被越来越多的使用者所熟知。本文介绍的项目是基于STM32设计的校园一卡通消费系统,通过RC522模块实现对IC卡的读写操作,利用2.8寸TFT触摸屏(驱动芯片是ILI9341)作为交互界

【自学开发之旅】Flask-前后端联调-异常标准化返回(六)

注册联调:前端修改:1.修改请求向后端的url地址文件:env.development修改成VITE_API_TARGET_URL=http://127.0.0.1:9000/v1登录:token验证校验forms/user.pyfromwerkzeug.securityimportcheck_password_has

热文推荐