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

                                        食用指南:本文为作者刷题中认为有必要记录的题目

                                        前置知识回溯法经典问题之组合

                                       ♈️今日夜电波:爱人错过—告五人

                                                                1:11 ━━━━━━️💟──────── 4:52
                                                                    🔄   ◀️   ⏸   ▶️    ☰ 

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍 


目录

回溯法的理解

💮 一、全排列

🌺二、全排列II


回溯法的理解

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

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

        记住一句话: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!  

                                 

                                                                 给个三连再走嘛~      

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞凌嵌入式受邀亮相2023中国国际数字经济博览会

9月6日&#xff0c;由工信部、国家发改委和河北省人民政府共同主办的2023中国国际数字经济博览会在石家庄国际会展中心&#xff08;正定&#xff09;开幕&#xff0c;近500家参展企业携自家的“黑科技”展品集中亮相&#xff0c;赋能智慧应用新场景&#xff0c;为观众带来了一场…

CG MAGIC分享3d Max中的Corona渲染器材质如何成转换VRay材质?

大家无论是使用Corona渲染器还是Vray渲染器时&#xff0c;进行材质问题时&#xff0c;都会遇到转化材质问题。 如何将CR转换成VR或者将VR转换CR材质呢&#xff1f; 对于这两者之间转换最好最好的方法只能是材质转换器。 CG MAGIC小编&#xff0c;梳理了两种方法&#xff0c;大…

最新基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法

文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研究…

Linux下的系统编程——认识进程(七)

前言&#xff1a; 程序是指储存在外部存储(如硬盘)的一个可执行文件, 而进程是指处于执行期间的程序, 进程包括 代码段(text section) 和 数据段(data section), 除了代码段和数据段外, 进程一般还包含打开的文件, 要处理的信号和CPU上下文等等.下面让我们开始对Linux进程有个…

idea配置gitLab

前言&#xff1a;网上有很多类似的文章&#xff0c;但描述不够详细 步骤1&#xff1a;安装git 如果安装成功再次点击TEST按钮展示如下&#xff1a;git版本 步骤2&#xff1a;idea配置gitlab 查看当前项目管理的 远程仓库再git的地址&#xff0c;该地址可是gitLab的&#xff0…

算法通关村第11关【白银】| 位运算高频算法题

一、移位的妙用 1.位1的个数 思路&#xff1a; 利用一个数和1与操作&#xff0c;结果就是最低位的特点&#xff0c;每次右移都能知道一位是不是1 public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int count 0;for(in…

企业架构LNMP学习笔记15

客户端缓存&#xff1a; B/S架构里&#xff0c;Browser是浏览器&#xff0c;就是客户端。 客户端缓存告知浏览器获取服务段的信息是在某个区间时间段是有效的。 每次请求从服务器拿一遍数据&#xff0c;数据没有变化&#xff0c;影响带宽&#xff0c;影响时间。刷新又要去加载…

Vue3中快速简单使用CKEditor 5富文本编辑器

Vue3简单使用CKEditor 5 前言准备定制基础配置富文本配置目录当前文章demo目录结构 快速使用demo 前言 CKEditor 5就是内嵌在网页中的一个富文本编辑器工具 CKEditor 5开发文档&#xff08;英文&#xff09;&#xff1a;https://ckeditor.com/docs/ckeditor5/latest/index.htm…

cartographer 学习

cartographer 学习 编译并运行代码 由于cartographer整体分成了两个包 一个是cartographer,不带ros的内容另一个是cartographer_ros&#xff0c;是已ros项目构建的 这样因为带了普通cmake的包&#xff0c;就没法使用catkin_make了&#xff0c;只能使用catkin_make_isolated …

Scala面向对象编程(高级部分)

1. 静态属性和静态方法 &#xff08;1&#xff09;回顾Java中的静态概念 public static 返回值类型 方法名(参数列表) {方法体} 静态属性… 说明: Java中静态方法并不是通过对象调用的&#xff0c;而是通过类对象调用的&#xff0c;所以静态操作并不是面向对象的。 &#xff0…

谈谈对OceanBase单机分布式一体化的思考

关于作者&#xff1a; 杨传辉&#xff0c;OceanBase CTO。2010 年作为创始成员之一加入 OceanBase 团队&#xff0c;主导了 OceanBase 历次架构设计和技术研发&#xff0c;从无到有实现 OceanBase 在蚂蚁集团全面落地。同时&#xff0c;他也主导了两次 OceanBase TPC-C 测试并打…

管理类联考——数学——汇总篇——知识点突破——数据分析——计数原理——排列组合——成双

&#x1f30a; 配对问题的解题思路&#xff1a;配对问题主要以鞋子或者手套来作为命题对象&#xff0c;其核心在于成双不成双&#xff0c;对于成双问题&#xff0c;直接选取整双即可&#xff0c;对于不成双问题&#xff0c;要先取成双的&#xff0c;然后从每双中取单只即可。 …

go语言学习笔记

Go学习 一直想学一门新语言&#xff0c;难度又不想太大&#xff0c;C和Java都会但是不怎么精通&#xff0c;某天看到Go语言&#xff0c;好的&#xff0c;就是它了。总体来说&#xff0c;go语言的学习还是相对简单&#xff0c;有编程基础的入手很快。 简介 go是一种并发、带垃…

【设计模式】一、设计模式七大原则

文章目录 设计模式概述设计模式七大原则设计模式的目的设计模式七大原则1. 单一职责原则2. 接口隔离原则3. 依赖倒转(倒置)原则4. 里氏替换原则5. 开闭原则&#xff08;Open-Closed Principle简称OCP原则&#xff09;6. 迪米特法则7. 合成复用原则&#xff08;Composite Reuse …

ABB REF615C-D HCFFAEAGABC2BAA1XD控制继电器

多功能保护&#xff1a;REF615C-D 继电器具备多种保护功能&#xff0c;包括过流、短路、地故障、欠频、过频、欠电压、过电压等&#xff0c;可用于监测和保护电力系统中的设备。 通信能力&#xff1a;该继电器支持通信协议&#xff0c;如IEC 61850、Modbus等&#xff0c;使其能…

YOLOv5算法改进(11)— 替换主干网络之EfficientNetv2

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。EfficientNetV2是一个网络模型&#xff0c;旨在提供更小的模型和更快的训练速度。它是EfficientNetV1的改进版本。EfficientNetV2通过使用更小的模型参数和采用一种称为Progressive Learning的渐进学习策略来实现这一目标。…

Benchmarking Chinese Text Recognition: Datasets, Baselines| OCR 中文数据集【论文翻译】

基础信息如下 https://arxiv.org/pdf/2112.15093.pdfhttps://github.com/FudanVI/benchmarking-chinese-text-recognition Abstract 深度学习蓬勃发展的局面见证了近年来文本识别领域的迅速发展。然而&#xff0c;现有的文本识别方法主要针对英文文本。作为另一种广泛使用的语…

NIFI实现JSON转SQL并插入到数据库表中

说明 本文中的NIFI是使用docker进行安装的&#xff0c;所有的配置参考&#xff1a;docker安装Apache NIFI 需求背景 现在有一个文件&#xff0c;里面存储的是一些json格式的数据&#xff0c;要求将文件中的数据存入数据库表中&#xff0c;以下是一些模拟的数据和对应的数据库…

初试小程序轮播组件

文章目录 一、轮播组件&#xff08;一&#xff09;swiper组件1、功能描述2、属性说明 &#xff08;二&#xff09;swiper-item组件1、功能描述2、属性说明 二、案例演示&#xff08;一&#xff09;运行效果&#xff08;二&#xff09;实现步骤1、创建小程序项目2、准备图片素材…

工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…