[Algorithm][回溯][全排列][子集] + 回溯原理 详细讲解

news2024/11/23 20:21:19

目录

  • 0.原理讲解
  • 1.全排列
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.子集
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


0.原理讲解

  • 回溯算法通常⽤于解决组合问题、排列问题和搜索问题
  • 回溯算法的基本思想
    • 从⼀个初始状态开始,按照⼀定的规则向前搜索,当搜索到某个状态⽆法前进时,回退到前⼀个状态,再按照其他的规则搜索
    • 回溯算法在搜索过程中维护⼀个状态树,通过遍历状态树来实现对所有可能解的搜索
  • 回溯算法的核⼼思想“试错”
    • 在搜索过程中不断地做出选择,如果选择正确,则继续向前搜索
    • 否则,回退到上⼀个状态,重新做出选择
  • 回溯算法通常⽤于解决具有多个解,且每个解都需要搜索才能找到的问题
  • 总结管他丫的深搜、回溯还是剪枝,画出决策树就完事:P
    • 决策树画的越详细越好
  • 回溯思考流程
    1. 决策树
    2. 设计代码
      • 全局变量
      • DFS()设计
    3. 细节问题:剪枝、回溯、递归出口
  • 注意:没有一成不变的模板,只要能把决策树画出来,把决策树转化成代码就够了

1.全排列

1.题目链接

  • 全排列

2.算法原理详解

  • 全局变量设计
    • vector<vector<int>> ret:存储结果
    • vector<int> path:存储路径
    • vector<bool> check:实现剪枝
  • DFS()设计思路:仅需关心某一个结点在干什么事情即可
  • 细节
    • 回溯
      • 剔除path最后一个元素
      • 修改check数组
    • 递归出口:遇到叶子结点的时候,直接添加结果
      请添加图片描述

3.代码实现

class Solution 
{
    vector<vector<int>> ret;
    vector<int> path;
    vector<bool> check; // 实现剪枝
public:
    vector<vector<int>> permute(vector<int>& nums) 
    {
        check.resize(nums.size(), false);
        DFS(nums);
        return ret;
    }

    void DFS(vector<int>& nums)
    {
        if(nums.size() == path.size())
        {
            ret.push_back(path);
            return;
        }

        for(int i = 0; i < nums.size(); i++)
        {
            if(!check[i])
            {
                path.push_back(nums[i]);
                check[i] = true;
                DFS(nums);

                // 回溯 -> 恢复现场
                path.pop_back();
                check[i] = false;
            }
        }
    }
};

2.子集

1.题目链接

  • 子集

2.算法原理详解

  • 思路一:每次盯着一个数,选或是不选

    • 全局变量
      • vector<int> path
      • vector<vector<int>> ret
    • DFS()设计
      • 函数头void DFS(nums, i)
        • i:下一层递归要选的元素
      • 函数体
        • 选:path += nums[i], DFS(num, i + 1)
        • 不选:DFS(nums, i + 1)
      • 递归出口i == nums.size()
    • 回溯:选时需要回溯
      请添加图片描述
  • 思路二:每次都只选一个数,此后只能选它后面的数

    • 全局变量
      • vector<int> path
      • vector<vector<int>> ret
    • DFS()设计
      • 函数头void DFS(nums, pos)
        • pos:下一层递归选择数时的起始下标
      • 函数体
        • 循环枚举还能选哪些数
      • 递归出口:不需要特定函数出口
    • 回溯:函数返回时回溯
      请添加图片描述
  • 思路二是优于思路一的

    • 思路二每次递归,都会是一个结果,而思路一结果只会出现在叶子节点上
    • 思路二递归的次数是要明显少于思路一的

3.代码实现

// v1.0 每次盯着一个数,选或是不选
class Solution 
{
    vector<vector<int>> ret;
    vector<int> path;
public:
    vector<vector<int>> subsets(vector<int>& nums) 
    {
        DFS(nums, 0);
        return ret;
    }

    void DFS(vector<int>& nums, int i)
    {
        if(i == nums.size())
        {
            ret.push_back(path);
            return;
        }

        // 选
        path.push_back(nums[i]);
        DFS(nums, i + 1);
        path.pop_back(); // 回溯,恢复现场

        // 不选
        DFS(nums, i + 1);
    }
};
----------------------------------------------------------------------------------
// v2.0 每次都只选一个数,此后只能选它后面的数
class Solution 
{
    vector<vector<int>> ret;
    vector<int> path;
public:
    vector<vector<int>> subsets(vector<int>& nums) 
    {
        DFS(nums, 0);
        return ret;
    }

    void DFS(vector<int>& nums, int pos)
    {
        ret.push_back(path);

        for(int i = pos; i < nums.size(); i++)
        {
            path.push_back(nums[i]);
            DFS(nums, i + 1);
            path.pop_back(); // 回溯,恢复现场
        }
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

针对关键 PuTTY 私钥恢复漏洞的 PoC 发布

安全研究人员针对广泛使用的 PuTTY SSH 和 Telnet 客户端中的一个关键漏洞发布了概念验证 (PoC) 漏洞利用。 该漏洞CVE-2024-31497允许攻击者恢复 PuTTY 版本 0.68 至 0.80 中使用 NIST P-521 椭圆曲线生成的私钥。 该漏洞源于 PuTTY在使用 P-521 曲线时偏向生成ECDSA随机数。…

[FSCTF 2023]ez_php1

一共有三小关 第一关&#xff1a;md5加密 第二关&#xff1a;反序列化 重点 单个字符串序列化 unserialize($str) "$KEY" <?php $KEY"YES I love";echo serialize($KEY); s:10:"YES I love"; 第三关&#xff1a; 反序列化 把a的地址赋给…

【linux-IMX6ULL-RTC-IIC-SPI配置思路】

目录 1. RTC简介1.1 IMX6ULL中的RTC1.2 SNVS_LP中的SRTC配置流程1.3 程序实现 2. IIC通信协议2.1 IIC基础2.2 IIC通信协议2.2.1 IIC写时序2.2.2 IIC读时序 3. IIC通信的硬件框图及配置流程3.1 IMX6ULL的硬件IIC框图3.1 IIC配置流程3.2 硬件IIC代码实现 4. SPI通信4.1 SPI通信基…

在云计算与人工智能中,7ECloud扮演着什么样的角色

数据驱动的时代&#xff0c;云计算和人工智能已成为推动现代科技进步的两大引擎。作为一家专注于云计算的公司&#xff0c;7ECloud正是在这个领域发挥自己的力量&#xff0c;力图为企业提供一站式解决方案&#xff0c;并拥有来自厂家的源头支持&#xff0c;用极其低的价格助力企…

思源笔记如何结合群晖WebDav实现云同步数据

文章目录 1. 开启群晖WebDav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar4. 配置远程同步地址5. 笔记远程同步测试6. 固定公网地址7. 配置固定远程同步地址 在数字化时代&#xff0c;信息的同步与共享变得尤为重要。无论是个人用户还是企业团队&#xff0c;都渴望能够实现跨…

【Django学习笔记(九)】Flask + MySQL的结合案例

Flask MySQL结合案例 前言正文案例1&#xff1a;添加用户1.1 浏览器发送请求&#xff0c;返回页面main.pyhtml页面 1.2 新增用户并连接数据库main.pyhtml页面 案例2&#xff1a;查询所有用户2.1 main.py2.2 html2.3 bootstrap优化html 前言 在本文中&#xff0c;介绍如何将 F…

2023 PWNHUB 3月赛-【tototo】

文章目录 volatile泄露_environ打栈漏洞利用malloc和calloc思路&#xff08;打_environ&#xff09;代码 volatile int volatile vInt; 当要求使用 volatile 声明的变量值的时候&#xff0c;系统总是重新从它所在的内存读取数据&#xff0c;即使它前面的指令刚刚从该处读取过数…

01基础篇

1、初识 JVM 1.1 什么是 JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步骤&#xff1a; 编写Java源代码文件。使用…

CentOS使用Docker搭建Nacos结合内网穿透实现无公网IP远程登录本地管理平台

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Nacos Nacos是阿里开放的一款中间件,也是一款服务注册中心&#xff0c;它主要提供三种功能&#xff1a;持久化…

Prompt Engineering ,Fine-tuning , RAG ?

Prompt Engineering ,Fine-tuning , RAG 总结&#xff1a;1 prompt engineering2 RAG (Retrieval Augmented Generation)**RAG特点****RAG优势****RAG劣势** 3 微调&#xff08;Fine-tuning&#xff09;**微调特点****微调优势****微调劣势** 4 三者共性和区别5 RAG和微调的适应…

Qt-FFmpeg开发-打开摄像头直接显示YUYV422图像(12)

Qt-FFmpeg开发-打开摄像头直接显示YUYV422图像&#x1f4c0; 文章目录 Qt-FFmpeg开发-打开摄像头直接显示YUYV422图像&#x1f4c0;1、概述&#x1f4f8;2、实现效果&#x1f4bd;3、主要代码&#x1f50d;4、完整源代码&#x1f4d1; 更多精彩内容&#x1f449;个人内容分类汇…

四川汇聚荣:做拼多多网点需要具备什么能力?

做拼多多网点需要具备什么能力?这个问题对于想要在电商平台上开店的商家来说&#xff0c;是必须要了解的。拼多多作为国内领先的社交电商平台&#xff0c;吸引了众多商家入驻。那么&#xff0c;要想在拼多多上开网店&#xff0c;需要具备哪些能力呢?下面就从四个方面进行详细…

02-WPF_基础(二)

3、控件学习 控件学习 布局控件&#xff1a; panel、Grid 内容空间&#xff1a;Context 之恶能容纳一个控件或布局控件 代表提内容控件&#xff1a;内容控件可以设置标题 Header 父类&#xff1a;HeaderContextControl。 条目控件&#xff1a;可以显示一列数据&#xf…

【LAMMPS学习】八、基础知识(6.5)PyLammps 教程

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

Windows 11 下 kafka 的安装踩坑

安装 windows系统kafka小白入门篇——下载安装&#xff0c;环境配置&#xff0c;入门代码书写&#xff08;推荐&#xff09; kafka在windows下安装和使用入门教程 问题1 参考链接 运行kafka集成的zookeeper时&#xff0c;命令&#xff1a;bin\windows\zookeeper-server-star…

2.1 软件工程

第2章 信息技术知识 2.1 软件工程 现状&#xff1a; 开发软件的规模越来越大复杂度越来越高用户需求并不十分明确缺乏软件开发方法和工具方面的有效支持 软件成本日益增长、开发进度难以控制、软件质量无法保证、软件维护困难等问题日益突出。人们开始用工程的方法进行软件…

Codeforces Round 941 (Div. 2)(A,B,C,D,E)

比赛链接 这场难度不高&#xff0c;基本没考算法&#xff0c;全是思维题。B是推结论&#xff0c;C是博弈&#xff0c;D是构造&#xff0c;需要对二进制有一定理解&#xff0c;E是思维题&#xff0c;2300分的暴力和模拟。 A. Card Exchange 题意&#xff1a; 您有 n n n 张牌…

纯血鸿蒙APP实战开发——一镜到底“页面转场”动画

介绍 本方案做的是页面点击卡片跳转到详情预览的转场动画效果 效果图预览 使用说明 点击首页卡片跳转到详情页&#xff0c;再点击进入路由页面按钮&#xff0c;进入新的路由页面 实现思路 首页使用了一种视觉上看起来像是组件的转场动画&#xff0c;这种转场动画通常是通过…

WordPress 管理员密码重置方法汇总

最近明月碰到一个 WordPress 站长求助咨询&#xff0c;说是自己 WordPress 站点的管理员密码被恶意篡改了&#xff0c;对 WordPress 了解的都知道这一般都是恶意代码造成的&#xff0c;问题大多出在使用了所谓的破解版、去授权版的插件或者主题被植入了恶意代码、后门木马。明月…

K8S安装并搭建集群

1. 先给每台机器安装docker环境 卸载旧的docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 配置docker的yum库 yum install -y yum-utilsyum-config-manager --a…