力扣刷题-47.全排列Ⅱ、深度优先搜索

2023-10-31

给定一个可包含重复数字的序列,返回所有不重复的全排列。

  1. 深度优先搜索(DFS)
      深度优先搜索就是在每一步对每一种可能的选择一条道走到底,然后再回过头尝试另外一种选择。
      深度优先搜索的关键是要考虑“当前这一步”该如何做,至于“下一步”该怎么做和当前这一步的解决方法是一样的。在进行当前步的选择之前要确定已经做出的选择列表,然后在剩余可供选择的每一种可能进行遍历,对于每一种选择将选择结果以及选择状态代入下一步操作,然后再次进行深度优先搜索。
      DFS的实现考虑要以下几个问题即可:
        ①.边界范围:即搜索终止条件,递归结束条件。
        ②.可供选择的范围列表:所有可供选择的范围列表。
        ③. 已做出的选择列表:标记当前已经做出的选择。
  2. 解题思路
      进行数字的全排列即用给定的数字范围在数组的每个位置进行每种情况的尝试,每一步选择时的操作方法是一样的,即可以DFS进行实现。
      由于存在重复的数字,即需要保证每个位置对数值相同的数字只做一次选择,可先将原数组进行排序,然后遍历时跳过相同的值即可。
  3. DFS代码模版
void dfs( int cur_step)
{
	//判断边界
	/********/
	//尝试当前可供选择的每种可能
	for(int i = 0;i < maxCount;i++)
	{
		//尝试每种选择
		/******/
		//选择结果代入下一步
		dfs(cur_step+1);
		//撤销当前选择,恢复状态
		/*******/
	}
}
  1. 代码示例
class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;//结果
        vector<int> vis = vector(nums.size(),0);//标记元素选择状态
        if(nums.size() == 0) return res;
        vector<int> cur_vector;//当前进行中的排列
        dfs(res,nums,vis,cur_vector);
        return res;

    }
    void dfs(vector<vector<int>> &res,vector<int>&nums,vector<int> &vis,vector<int> cur_vector )
    {
        if( cur_vector.size() == nums.size())
        {
            res.push_back(cur_vector);
            return;
        }
        for( int i = 0;i < nums.size();i++)
        {
            if(vis[i] == 1) continue;
            int cur_value = nums[i];
            cur_vector.push_back(nums[i]);
            vis[i] = 1;
            dfs(res,nums,vis,cur_vector);
            cur_vector.pop_back();
            vis[i] = 0;
            while( i+1 <nums.size() &&  nums[i+1] == nums[i])//去重复
            {
                i++;
            }   
        }
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

力扣刷题-47.全排列Ⅱ、深度优先搜索 的相关文章

随机推荐

  • MATLAB 中的非线性回归:将复杂模型拟合到数据

    线回归是一种强大的技术 用于将复杂模型拟合到不遵循线性关系的数据 MATLAB 提供了强大的工具来执行非线性回归分析 使您能够找到最适合模型的参数并根据拟合模型进行预测 在本教程中 我们将介绍使用 MATLAB 环境中可用的数据集在 MAT
  • window安装Linux

    一 安装VMware 可通过VMware官网VMware Delivering a Digital Foundation For Businesses下载正版VMware 下载完成后直接打开 或使用管理员身份运行 点击是 点击下一步 点击我
  • 最简单的网页登录注册功能讲解及其实现

    目录 前言 结构 创建数据库存储账户信息 html注册页面 注册处理后台程序 html登录页面 后台登录处理程序 演示 前言 最近打算做一个网页登录的练习 今天撸一个最简单的demo 记录一下学习的过程 结构 实现一个网页最基本的注册与登录
  • SpringSecurity系列 之 集成第三方登录(包括默认的用户名密码、短信验证码和github三种登录方式)

    一 前言 前面在 SpringSecurity系列 之 认证过程和原理 一文中 我们已经学习了SpringSecurity的认证过程 实现过程如下图所示 根据这个认证过程 我们如何实现集成多种第三方登录的方案呢 我们这里提供了一种思路 首先
  • (若依)RuoYi后台管理框架前端

    若依后台管理 官方网址 后台管理二开推荐 官网的源码地址可供下载前后端代码 最近进到公司后跟着团队接了两家公司的App一套的开发 到公司的第一天就是先配置开发环境 安装软件之类的 第二天 带着熟悉RuoYi框架 很巧带我的大哥和我是一个学校
  • 关于一些奇葩的兼容bug

    iPhoneXr canvas层级失效 大致就是这样 一个img在canvas上面 所有手机img正常显示 就是ios的这个机型有问题 系统版本14 0 img的层级不论多大都会被canvas覆盖 解决办法尽然是将canvas的层级设置为
  • Ubuntu下FastDFS环境的安装搭建

    Ubuntu下FastDFS环境的安装搭建 一 FastDFS简介 FastDFS是一个个人开发的 轻量级的 开源的分布式文件系统 纯C语言编写 其功能包括 文件存储 文件同步 文件访问 文件上传 文件下载 等 解决了大容量存储和负载均衡的
  • Qt主线程卡死,竟然与X11 的 _XReply() 有关

    在ubuntu系统下运行Qt程序 Qt的程序就相当于X11的一个客户端 受X11的限制 近期 在处理一起离奇事件 发现UI的qt界面已经卡死了 无鼠标键盘任何反应 但程序是运行的 比如与其他设备通信是正常的 说明程序本身没有死掉 通过断点
  • 中移链Java-SDK实战使用

    id BSN 2021 公众号 BSN研习社 作者 中移信息 中移链是基于EOS区块链框架改造 满足BSN开放联盟链要求 符合国内监管政策 BSN开放联盟链 BSN Open Permissioned Blockchain 简称OPB 包括
  • ★教程1:matlab学习教程入门100例目录

    1 订阅本教程用户可以免费获得本博任意2个 包括所有免费专栏和付费专栏 博文对应代码 私信博主给出代码博文的链接和邮箱 2 本MATLAB课程的所有案例 部分理论知识点除外 均由博主编写而成 供有兴趣的朋友们自己订阅学习使用 未经本人允许
  • React性能优化的8种方式了解一下

    react凭借virtual DOM和diff算法拥有高效的性能 除此之外也有很多其他的方法和技巧可以进一步提升react性能 在本文中我将列举出可有效提升react性能的几种方法 帮助我们改进react代码 提升性能 但是我们不必一定要在
  • 记一次Mac挖矿病毒的处置

    title 记一次Mac挖矿病毒的处置 前言 网络安全圈一年一度的叉叉行动的前期准备过程中 在客户现场进行失陷主机监测和处置 通过态势感知发现某台终端主机有每五分钟向矿池 43 249 204 183 8888 发起一次连接请求的情况 态势
  • Python +selenium 实现自动校园网页登录 (Firefox)

    目的 通过分析页面 实现校园网自动输入账号密码 点击登录的操作 环境部署 win10 Firefox 87 64位 python 3 9 安装selenium pip install selenium 安装driver for firefo
  • 小红书评分8.7(从零开始学Python),入门新手必看

    前言 Python 是一种面向对象 解释型计算机程序设计语言 由 Guido van Rossum 于 1989 年底发明 第一个公开 发行版发行于 1991 年 Python 语法简洁而清晰 具有丰富和强大的类库 它常被昵称为胶水语言 能
  • window10基于WSL,通过ppa快速搭建LNMP环境,打造thinkphp6+swoole+docker开发环境(php8.0,对其他版本也适用)

    安装WSL2和UBUNTU 换源 两种方式都行 不过改之前都要记得备份 1 一行语句搞定 sudo sed i s archive ubuntu com mirrors ustc edu cn g etc apt sources list
  • PLSQL环境配置详细步骤

    下载PLSQL和instantclient 配置PLSQL 打开plsql 点击取消按钮 会进入主界面 点击配置 有的版本是选择Tools 首选项 第一个选项 选择Oracle client 安装的主目录D PLsql InstantCli
  • 软件测试与质量 第一章

    目录 一 什么是软件测试 1 1 测试目的 1 2 测试内容 手段和过程 1 2 1 手工动态测试涉及的工作 1 2 2 静态检查 1 2 3 自动化动态测试系统涉及的工作 1 2 4 软件测试的流程 1 3 小结 1 4 软件测试的分类
  • UE4 C++(20) UnrealPak打包和打补丁

    12 27 2020 文章目录 前言 打包 Package 资源类型 执行打包命令 HotPatcher插件 获取资源信息 GetAssetData 路径转换 ConvLongPackageNameToPackagePath 获取资源GUI
  • 最小生成树之普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法

    作者 STzen 链接 https www jianshu com p 683ffde4f3a3 来源 简书 最小生成树 列子引入 如图假设v0到v8表示9个村庄 现在需要在这9个村庄假设通信网络 村庄之间的数字代表村庄之间的直线距离 求用
  • 力扣刷题-47.全排列Ⅱ、深度优先搜索

    给定一个可包含重复数字的序列 返回所有不重复的全排列 深度优先搜索 DFS 深度优先搜索就是在每一步对每一种可能的选择一条道走到底 然后再回过头尝试另外一种选择 深度优先搜索的关键是要考虑 当前这一步 该如何做 至于 下一步 该怎么做和当前