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

news2024/10/6 10:38:07

文章目录

    • 题目
    • 方法一:递归+回溯

题目

在这里插入图片描述
这题中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.coloradmin.cn/o/977264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ToBeWritten之威胁狩猎

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

高并发下机器QPS计算、最佳线程数计算

一、QPS&#xff0c;每秒查询 QPS&#xff1a;Queries Per Second意思是“每秒查询率”&#xff0c;是一台服务器每秒能够相应的查询次数&#xff0c;是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中&#xff0c;作为域名系统服务器的机器的性能经常…

macos13 arm芯片(m2) 搭建hbase docker容器 并用flink通过自定义richSinkFunction写入数据到hbase

搭建hbase docker容器 下载镜像 https://hub.docker.com/r/satoshiyamamoto/hbase/tags 点击run 使用镜像新建容器 填写容器名和 容器与宿主机的端口映射 测试 通过宿主机访问容器内的hbase webUI http://localhost:60010/master-status

WINGREEN 03ZSTI4-00-501

中央处理单元&#xff08;CPU&#xff09;支持&#xff1a;WINGREEN 03ZSTI4-00-501 控制主板模块可能配备了一个或多个CPU核心&#xff0c;用于处理数据和执行指令。 内存支持&#xff1a; 它可以支持系统内存&#xff08;RAM&#xff09;&#xff0c;以存储和访问数据。 输…

C语言共用体详解

文章目录 共用体解释代码说明小端存储 Little Endian共用体与小端存储为什么只能用第一个成员类型的值初始化一个共用体变量 共用体解释 共用体&#xff08;Union&#xff09;是一种特殊的数据类型&#xff0c; 它允许在同一个内存位置存储不同的数据类型。 共用体的所有成员共…

ICCOA蓝牙数字车钥匙2.0

近期&#xff0c;ICCOA智慧车联开放联盟宣布&#xff0c;由小米、vivo、OPPO、长安、深蓝、吉利、极氪、比亚迪、北汽、蔚来、零跑、雪球、瓶钵、融卡等企业联合参与制定的ICCOA蓝牙数字车钥匙2.0标准&#xff08;简称DK2.0&#xff09;&#xff0c;于2023年9月1日正式发布实施…

【网络编程·数据链路层】MAC帧/以太网协议/ARP协议/RARP协议

需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、MAC帧 1、IP地址和MAC地址的区别 2、MAC帧协议 3、MTU对IP协议的…

Python 3.x标准数据类型

文章目录 一、数字1.1 基本的数字类型有:1.2 整数数字表示方式二、字符串2.1 操作符2.2 格式化百分号format 格式化输出位置匹配2.3 字符串 索引和切片2.4 切片:字符串 [ 起始索引:终止索引:步长 ]字符串连接操作三、列表3.1 列表的定义3.2 常用方法(功能:增删改查)增删除…

S7-1200/1500增量式PID(输出归一化、支持PWM输出)

离散增量式PID算法公式请查看下面文章链接: 三菱PLC增量式PID算法FB(带死区设置和外部复位控制)_用三菱plc自己编写pid算法_RXXW_Dor的博客-CSDN博客关于PID废话不多说,各种位置式增量式资料和公式网上也非常多。PID从提出和发展目前已经一个世纪过去了,还在不断研究创新,…

使用Puppeteer构建博客内容的自动标签生成器

导语 标签是一种用于描述和分类博客内容的元数据&#xff0c;它可以帮助读者快速找到感兴趣的主题&#xff0c;也可以提高博客的搜索引擎优化&#xff08;SEO&#xff09;。然而&#xff0c;手动为每篇博客文章添加合适的标签是一件费时费力的工作&#xff0c;有时候也容易遗漏…

【SpringBoot应用篇】SpringBoot集成MinIO对象存储服务

【SpringBoot应用篇】SpringBoot集成MinIO对象存储服务 对象存储服务MinIOMinIO简介MinIO特点开箱使用docker安装启动管理控制台 快速入门Java 上传文件到minio配置访问权限 封装MinIO为starter创建模块zy-minio-starter配置类封装操作minIO类对外加入自动配置其他微服务使用 安…

好绝一数据可视化工具,零编程“BI+方案”

在一开始的时候&#xff0c;国外BI数据可视化工具的使用人群圈定在IT人员身上&#xff0c;所以我们可以看到国外BI数据可视化工具对使用者的IT技术要求较高&#xff0c;真正具有强烈数据分析需求的业务们反而无法按需分析。而现在&#xff0c;随着国产BI的崛起&#xff0c;面向…

Java线程概述 (二)线程实例演示

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;创建线程的三种方式&#x1f415;使用java.lang包下的Thread类&#x1fa85;实现Runnable接口&#x1f993;实现Callable接口 &#x1f415;synchronized简单介绍&#x…

Java手写数组队列和链表队列并使用java里面现成的队列方法

Java队列实现与常用使用方法介绍 说明使用数组手动实现队列功能使用单向链表手动实现队列功能Java中ArrayBlockingQueue和ArrayQueue和LinkedBlockingQueue使用ArrayQueue使用方法如下:ArrayBlockingQueue常用使用方法如下:LinkedBlockingQueue常用使用方法如下:ArrayBlockingQ…

Spring-mvc的参数传递与常用注解的解答及页面的跳转方式---综合案例

目录 一.slf4j--日志 二.常用注解 2.1.RequestMapping 2.2.RequestParam 2.3.RequestBody 2.4.PathVariable 三.参数的传递 3.1 基础类型 3.2 复杂类型 3.3 RequestParam 3.4 PathVariable 3.5 RequestBody 3.6 增删改查 四.返回值 4.1 void 返回值 4.2 String 返…

用go实现dns请求

一、DNS报文格式详解 1.1 报文格式 DNS分为查询请求和查询响应&#xff0c;两者的报文结构基本相同。DNS报文格式如下表展示 0 1516 31事务ID&#…

CVE-2023-28303(截图修复)

在做羊城杯的misc的时候发现了一个图片&#xff0c;典型的图片高度不对&#xff0c;修改之后对图片的高度进行不断修改尝试&#xff0c;发现图片很大&#xff0c;但是内容没有出现&#xff0c; 从这里指知道存在feld文件x 截出zip文件内容&#xff0c;把04 03 改为03 04 这里的…

SOLIDWORKS放样是什么意思?

SOLIDWORKS是一款广受欢迎的三维计算机辅助设计&#xff08;CAD&#xff09;软件&#xff0c;提供了许多强大的功能来帮助工程师实现他们的创意。其中一个重要的功能是放样功能&#xff0c;它在设计过程中起着至关重要的作用。本文将介绍SOLIDWORKS放样的概念、特点和应用。 放…

怎么将火狐浏览器中的书签或密码迁移到谷歌浏览器

文章目录 一、点击谷歌浏览器右上角二、选择书签–导入书签和设置…三、点击导入 一、点击谷歌浏览器右上角 二、选择书签–导入书签和设置… 在下拉框中选中Firefox&#xff0c;点击导入 三、点击导入

sublime text 格式化json快捷键配置

以 controlcommandj 为例。 打开Sublime Text&#xff0c;依次点击左上角菜单Sublime Text->Preferences->Key Bindings&#xff0c;出现以下文件&#xff1a; 左边的是Sublime Text默认的快捷键&#xff0c;不可编辑。右边是我们自定义快捷键的地方&#xff0c;在中括号…