【算法】回溯与深搜

news/2024/7/20 22:51:22 标签: 算法, 深度优先

方法论

1.构建决策树
2.设计代码:全局变量、dfs函数
3.剪枝,回溯

全排列

给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1]
输出:[[0,1],[1,0]]

思路:

首先构建决策树,这道题无非就是遍历所有数字然后组合,我们选择采用dfs深度优先的遍历方法,同时用一个bool数组check判断该数是否被遍历过,每一遍的答案放在path数组里,当path数组的长度等于nums长度时则加入到ret结果数组中,同时回溯,即把path数组pop_back(),并把check数组的该位置设为false。

class Solution {
    vector<vector<int>> ret;
    vector<int> path;
    bool check[7];
public:
    vector<vector<int>> permute(vector<int>& nums) 
    {
        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]==false)
            {
                path.push_back(nums[i]);
                check[i]=true;
                dfs(nums);
                //回溯(恢复现场)
                path.pop_back();
                check[i]=false;
            }
        }
    }
};

子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的
子集
(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:

输入:nums = [0]
输出:[[],[0]]

思路1:

从0到n遍历nums,决策树判断每个元素选不选

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)
    {
        if(pos==nums.size())
        {
            ret.push_back(path);
            return;
        }

        //选
        path.push_back(nums[pos]);
        dfs(nums,pos+1);
        path.pop_back();//恢复现场

        //不选
        dfs(nums,pos+1);
        
    }
};

思路2:

构建决策树以节点数量来判断,第一层为空,第二层一个节点,第三层两个节点,以此类推。
在这里插入图片描述

class Solution {
    vector<int> path;
    vector<vector<int>> ret;
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.niftyadmin.cn/n/5447749.html

相关文章

Subscription Store: 建立订阅 WooCommerce 商店的详细教程- US Domain Center主机

第一步&#xff1a;了解订阅 WooCommerce 商店 订阅 WooCommerce 商店是一种电子商务模式&#xff0c;其中您提供定期付费的订阅服务或商品。这可以是内容订阅&#xff08;如新闻、杂志、电子书等&#xff09;、产品订阅&#xff08;如美容产品、食品、衣物等&#xff09;或服…

使用Intellij idea编写Spark应用程序(Scala+SBT)

使用Intellij idea编写Spark应用程序(ScalaSBT) 对Scala代码进行打包编译时&#xff0c;可以采用Maven&#xff0c;也可以采用SBT&#xff0c;相对而言&#xff0c;业界更多使用SBT。 运行环境 Ubuntu 16.04 Spark 2.1.0 Intellij Idea (Version 2017.1) 安装Scala插件 安…

AT25HP256/512

关于AT25HP256/512系列串行EEPROM&#xff08;电气可擦可编程只读存储器&#xff09;的数据手册&#xff0c;由Atmel公司发布。这些存储器通过串行外设接口&#xff08;SPI&#xff09;与微控制器等设备通信&#xff0c;并提供高可靠性的数据存储解决方案。以下是文档内容的翻译…

微服务鉴权的几种实现方案

1.Token 1.1 Token透传&#xff08;不推荐&#xff09; 刚开始接触微服务时网上给的方案大都数是通过透传Token做鉴权&#xff0c;但我认为这种方式不是很妥当。接着往下看&#xff1a; 这种方式通过透传Token使得各微服务都能获取到当前登录人信息&#xff0c;在代码编写上确…

docker将本地镜像pull到阿里云和registry

目录 一、上次到阿里云服务器 1、制作一个带有vim功能的Ubuntu镜像 2、在阿里云上面创建镜像仓库 3、从阿里云仓库中上传和拉取镜像 二、上传镜像到本地私有库registry 1、下载镜像docker registry 2、运行私有库registry&#xff0c;相当于本地有个私有docker hub。 3…

Go-Gin-Example 第七部分 定制GORM CallBacks 实现软删除

文章目录 涉及知识点本节目标项目原有问题 实现CallBacks新增方法注册CallBacks验证 通过callbacks实现软硬删除实现callbacks注册CallBacks验证 涉及知识点 GORM 本身是由回调驱动的&#xff0c;所以我们可以根据需要完全定制gorm GORM itself is powered by Callba加粗样式c…

java数据结构与算法基础-----字符串------正则表达式的练习案例---持续补充中

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 正则表达式基础&#xff1a;https://blog.csdn.net/grd_java/article/det…

Linux初学(七)内存与进程管理、计划任务

一、内存与进程 1.1 查看内存 命令&#xff1a;free -m 选项&#xff1a;-m 以mb的显示 [rootlocalhost ~]# free -mtotal used free shared buff/cache available Mem: 1819 200 1184 9 435 1426 Swap: 2047 0 2047 Me…