每日刷题|回溯法解决全排列问题

简介: 每日刷题|回溯法解决全排列问题

回溯法的理解

本文参考了一位大佬的题解,详细的介绍了回溯法:链接

上一篇刷题文:回溯法经典问题之子集

       记住一句话:for循环横向遍历,递归纵向遍历,回溯不断调整结果集。这句话将从始至终贯穿我们对于以上问题的回溯解决办法。

💮 一、全排列

题目链接:46. 全排列

题目描述:

      给定一个不含重复数字的数组 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]]

示例 3:

输入:nums = [1]

输出:[[1]]



提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

本题思路:

       首先:采用经典的“回溯三部曲”:

      1、定义两个全局变量,一个用来存放符合条件单一结果(path),一个用来存放符合条件结果的集合(result)。

       2、回溯的主体,回溯终止条件。path保存一组数据,每次遍历到叶子节点,再插入到result中,并且回溯到上一个节点。

       3、单层搜索的过程。for循环用来横向遍历,递归的过程是纵向遍历。

根据题意我们做出一定的改动:

       我们额外定义一个bool类型的used用于确定每一个节点是否使用过,以此来解决重复插入的问题,并且也可以通过used对应的位置是否为false来确定是否进行后续操作。一句话概括就是:只有当used[i]==0时才去进行后续操作。

      一图让你了解~以{1,2,3}为例

class Solution {
private:
vector<int> path;
vector<vector<int>> result;
void trackback(vector<int>& nums,vector<bool>& used)
{
    if(path.size()==nums.size())
    {
        result.push_back(path);
    }
    for(int i=0;i<nums.size();i++)
    {
        if(used[i]!=1)
        {
            path.push_back(nums[i]);
            used[i]=1;
            trackback(nums,used);
            used[i]=0;
            path.pop_back();
        }
    }
}
public:
    vector<vector<int>> permute(vector<int>& nums) {
        path.clear();
        result.clear();
        vector<bool> used;
        used.resize(nums.size());
        sort(nums.begin(),nums.end());
        trackback(nums,used);
        return result;
    }
};

🌺二、全排列II

题目链接:47. 全排列 II

题目描述:

      给定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]

输出:

[[1,1,2],

[1,2,1],

[2,1,1]]


示例 2:

输入:nums = [1,2,3]

输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

本题思路:

       本题实际上为上一题的拓展题目,基本上的思路跟上一题是的没什么区别的,但是由于此题中的元素是可以重复的,那我们就不能按照上一题只需要全部遍历一遍节点即可,在这里,我们需要加入剪枝操作,以此来解决重复选取问题。一句话概括就是:同一树枝上可以选取,但是同一树层上不可以选取!

即:添加这段判断语句{i>0&&nums[i-1]==nums[i]&&used[i-1]==0}来筛选重复的元素!

       一图让你了解~以{1,1,2}为例

class Solution {
private:
vector<int> path;
vector<vector<int>> result;
void trackback(vector<int>& nums,vector<bool>& used)
{
    if(path.size()==nums.size())
    {
        result.push_back(path);
        return;
    }
    for(int i=0;i<nums.size();i++)
    {
        if(i>0&&nums[i-1]==nums[i]&&used[i-1]==0)
        continue;
          if (used[i] != 1)
            {
                path.push_back(nums[i]);
                used[i] = 1;
                trackback(nums, used);
                used[i] = 0;
                path.pop_back();
            }
    }
}
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        path.clear();
        result.clear();
        vector<bool> used;
        used.resize(nums.size());
        sort(nums.begin(),nums.end());
        trackback(nums,used);
        return result;
    }
};



  感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!  

相关文章
|
机器学习/深度学习 数据采集 SQL
一文读懂大数据实时计算(一)
本文分为四个章节介绍实时计算,第一节介绍实时计算出现的原因及概念;第二节介绍实时计算的应用场景;第三节介绍实时计算常见的架构;第四节是实时数仓解决方案。
3141 0
一文读懂大数据实时计算(一)
|
机器学习/深度学习
【机器学习】凸函数判定
【1月更文挑战第23天】【机器学习】凸函数判定
|
机器学习/深度学习 人工智能 数据可视化
基于YOLOv8的田间杂草检测识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
本项目基于YOLOv8实现田间杂草检测识别,包含完整源码、数据集与PyQt5图形界面,支持图片、视频、摄像头等多场景检测,提供详细训练与部署教程,开箱即用,适合农业智能化应用与AI学习。
|
10月前
|
前端开发 UED
网站设计:20个常用技巧
这是一篇关于网站设计技巧的分享文章,涵盖了20多个实用的小技巧,包括设置浏览器兼容性、禁用右键和复制功能、自定义图标、防止页面被另存为、删除确认提示、获取控件位置、光标定位、屏蔽功能键等。这些技巧适用于前端开发,能够提升网页的功能性和用户体验。欢迎补充更多实用技巧!
|
数据采集 数据可视化 数据挖掘
深入浅出:使用Python进行数据分析的基础教程
【10月更文挑战第41天】本文旨在为初学者提供一个关于如何使用Python语言进行数据分析的入门指南。我们将通过实际案例,了解数据处理的基本步骤,包括数据的导入、清洗、处理、分析和可视化。文章将用浅显易懂的语言,带领读者一步步掌握数据分析师的基本功,并在文末附上完整的代码示例供参考和实践。
|
存储 应用服务中间件 nginx
Nginx入门 -- 基本数据结构中之ngx_str_t,ngx_array_t
Nginx入门 -- 基本数据结构中之ngx_str_t,ngx_array_t
300 1
|
SQL 数据库 Windows
如何在 Windows 上安装SSMS,保姆级教程来了!
安装SQL Server Management Studio (SSMS) 的过程包括:从安装界面或微软官网下载SSMS安装包,点击运行,选择安装选项,等待安装完成,并通过SSMS连接到数据库以验证安装成功。图文教程详细展示了每个步骤,包括所需截图。
|
机器学习/深度学习 Java TensorFlow
如何在Java中实现图像识别
如何在Java中实现图像识别
|
存储 算法 安全
密钥密码学(一)(2)
密钥密码学(一)
480 1
|
Java 网络安全
SSL peer shut down incorrectly
SSL peer shut down incorrectly
1576 0