【LeetCode-中等题】46. 全排列

文章目录

    • 组合+并集问题汇总:
    • 题目
    • 方法一:递归+回溯

组合+并集问题汇总:

1、子集去重版本
2、组合去重版本
3、子集非去重版本

题目

在这里插入图片描述
这题中nums中的数各不相同,所以不需要去重:
而下面这题,nums中的数会存在重复值,就需要去重:

参考讲解视频:代码随想录—全排列不去重版本

方法一:递归+回溯

关键在于递归之后还要还原做回溯动作:

	path.add(nums[i]);//加入子结果集usered[i] = true;//将该位置标志位标为true  往下不能取了backtrace(nums,path,usered);//往下面继续递归usered[i] = false;//某次递归结束后,要回溯回去,就得把之前该的标志位还原path.remove(path.size()-1);//某次递归结束后,要回溯回去,当前path应该把递归之前加的元素给剔除掉

在这里插入图片描述

所以最后,我们统计到的res才是不断扩增结果集的,而usered标志数组和list子集合其实都是中间临时的,是会随着递归改变,并且随着回溯复原的,所以程序最后list子集合肯定是空的,并且标志数组也是初始化的时候的样子

所以在这句代码中的 res.add(new ArrayList<>(path))将子集合加入到结果集的时候就需要将满足条件的子结果集复制一份再放到最终结果集

      if(path.size() == nums.length) {//递归出口(子结果集大小 = 数组大小 )res.add(new ArrayList<>(path));//因为path是实时变化的,必须要将path复制到一个新数组再放到res结果集return;}

如果我们这样做: res.add(path); ,直接将子结果集放到最终结果集,就会导致加入的子结果集为空,因为path子集合因为会做回溯操作 ,最后肯定加入的就是一个空数组,,满足条件的path只是一个中间状态。

在这里插入图片描述

class Solution {List<List<Integer>> res = new ArrayList<>();//最后的结果集public List<List<Integer>> permute(int[] nums) {List<Integer> path = new ArrayList<>(); //子结果集boolean[] usered = new boolean[nums.length]; //标记数组backtrace(nums,path,usered);return res;}public void backtrace(int[] nums ,List<Integer> path ,boolean[] usered){if(path.size() == nums.length) {//递归出口(子结果集大小 = 数组大小 )res.add(new ArrayList<>(path));//因为path是实时变化的,必须要将path复制到一个新数组再放到res结果集return;}for(int i = 0 ; i < nums.length ; i++){if(usered[i]) continue;//如果标志位为true  则直接跳过else{path.add(nums[i]);//加入子结果集usered[i] = true;//将该位置标志位标为true  往下不能取了backtrace(nums,path,usered);//往下面继续递归usered[i] = false;//某次递归结束后,要回溯回去,就得把之前该的标志位还原path.remove(path.size()-1);//某次递归结束后,要回溯回去,当前path应该把递归之前加的元素给剔除掉}}}
}

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

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

相关文章

javaee spring 测试aop 切面

切面类 package com.test.advice;import org.aspectj.lang.ProceedingJoinPoint;//增强类 public class MyAdvice {//将这个增强方法切入到service层的add方法前public void before(){System.out.println("添加用户之前");}}目标类 package com.test.service;publi…

【脑机接口】基于运动想象的康复指导在脑卒中偏瘫患者中的应用

【摘要】 目的 探讨运动想象康复指导对脑卒中偏瘫患者的康复效果及意义。 方法 将 60例脑卒中偏瘫患者随机分为观察组(n31)和对照组(n29)&#xff0c;对照组的康复训练指导采用讲解示范法&#xff0c;观察组采用运动想象法 。比较两组 患者 的运 动功能 、日常生活 活动能力及 …

【EI会议征稿】第三届机械自动化与电子信息工程国际学术会议(MAEIE 2023)

第三届机械自动化与电子信息工程国际学术会议&#xff08;MAEIE 2023&#xff09; 第三届机械自动化与电子信息工程国际学术会议&#xff08;MAEIE 2023&#xff09;将于2023年12月15-17日在江苏南京举行。本会议通过与业内众多平台、社会各团体协力&#xff0c;聚集机械自动…

RabbitMQ学习笔记

1、什么是MQ&#xff1f; MQ全称message queue&#xff08;消息队列&#xff09;&#xff0c;本质是一个队列&#xff0c;FIFO先进先出&#xff0c;是消息传送过程中保存消息的容器&#xff0c;多 用于分布式系统之间进行通信。 在互联网架构中&#xff0c;MQ是一种非常常见的…

【数据库】MySQL基础知识全解

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于拓跋阿秀、小林coding等大佬博客进行的&#xff0c;每个知识点的修…

一百七十三、Flume——Flume写入HDFS后的诸多小文件问题

一、目的 在用Flume采集Kafka中的数据写入HDFS后&#xff0c;发现写入HDFS的不是每天一个文件&#xff0c;而是一个文件夹&#xff0c;里面有很多小文件&#xff0c;浪费namenode的宝贵资源 二、Flume的配置文件优化&#xff08;参考了其他博文&#xff09; &#xff08;一&a…

c语言初阶指针

目录 何为指针 地址大小 野指针 成因 如何规避 有效性 指针计算 -整数 ​编辑 指针比较运算 指针-指针 ​编辑 数组与指针关系 二级指针 指针数组 应用 何为指针 指针就是指针变量&#xff0c;用来存放内存空间的一个编号&#xff0c;将指针比作我们宾馆的客人&a…

java基础(三)

101.如何让写出去的数据能成功生效? flush()刷新数据 close()方法是关闭流&#xff0c;关闭包含刷新&#xff0c;关闭后流不可以继续使用了。 102.学会字节流完成文件的复制&#xff08;支持一切的文件&#xff09; public class CopyDemo05 { public static void main(St…

css transition属性

如果想实现一些效果&#xff1a;比如一个div容器宽高拉伸效果&#xff0c;或者一些好看的有过渡的效果可以使用 定义和用法 transition 属性是一个简写属性&#xff0c;用于设置四个过渡属性&#xff1a; transition-property transition-duration transition-timing-func…

sqlserver 各种集合、区间、 时间轴(持更)

1.所有有交集的区间 场景&#xff1a;在事件表里查找某年员工的岗位系数&#xff0c;并计算其加权平均数。case1&#xff1a;该员工是老员工&#xff0c;从2020年一直到2049年。case2&#xff1a;该员工是老员工&#xff0c;但是今年离职。case3&#xff1a;该员工是今年的新员…

使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile (KMM) 开发

使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile (KMM) 开发 文章中探讨了 Google 提供的应用架构指南在多平台上的实现。通过共享视图模型&#xff08;View Models&#xff09;和共享 UI 状态&#xff08;UI States&#xff09;&#xff0c;我们可以专注于在原生端…

网络编程day5作业

1. 根据select TCP服务器流程图编写服务器&#xff08;上交&#xff09; #include <myhead.h> #define ERR_MSG(msg) do{\fprintf(stderr,"__%d__",__LINE__);\perror(msg);\ }while(0) #define PORT 6666 #define IP "192.168.114.50" int main(in…