[leetcode] 46. 全排列

news2024/11/23 12:14:17

文章目录

  • 题目描述
  • 解题方法
    • dfs
      • java代码
      • 复杂度分析
  • 相似题目

题目描述

给定一个不含重复数字的数组 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 中的所有整数 互不相同

解题方法

dfs

一看题目描述就想到用dfs,我来说一下具体思路。

每次dfs遍历,我们选择其中的一个数字,放在当前排列的队尾,然后进入下一层dfs,再从剩下的数字中选择一个,放在当前排列的队尾。按照上面的方法不断dfs,直到没有剩余数字,即所有数字都被选择,则当前排列完成,将当前排列加入结果集。

那有童鞋会说,我们怎么确保没有选择重复数字呢?其实也很简单,我们设置一个boolean类型数组flag,初始时flag数组元素都为false。设数字的下标为i,当i下标的数字被选择时,则将flag[i]置为true,每次dfs遍历时,我们只能从flag[i]false的位置选择数字,这样就保证了我们不会选到重复数字。

说了这么多,那我们看下java代码吧。

java代码

public List<List<Integer>> permute(int[] nums) {
    // 记录排列标记(true代表该位置的数字已加入到排列中,false代表未加入)
    boolean[] flags = new boolean[nums.length];
    List<List<Integer>> permutations = new ArrayList<>();
    List<Integer> permutation = new ArrayList<>();
    dfs(nums, flags, 0, permutation, permutations);
    return permutations;
}

// flag记录已选择数字位置,depth是dfs深度,permutation是当前排列,permutations是总的排列结果集
public void dfs(int[] nums, boolean[] flags, int depth, List<Integer> permutation, List<List<Integer>> permutations) {
    if (depth == nums.length) {
        permutations.add(new ArrayList<>(permutation));
        return;
    }
    for (int i = 0; i < nums.length; i++) {
        if (flags[i]) {
            continue;
        }
        flags[i] = true;
        permutation.add(nums[i]);
        dfs(nums, flags, depth + 1, permutation, permutations);
        // 下一层dfs完成时,记得将当前排列的队尾元素移除,并将flag[i]置为false
        permutation.remove(permutation.size() - 1);
        flags[i] = false;
    }
}

复杂度分析

时间复杂度: O ( N 2 ) O(N^{2}) O(N2) N N N n u m s nums nums数组长度,需要进行 N N N次dfs,每次dfs需要遍历整个数组。
空间复杂度: O ( N ) O(N) O(N),需要为每一层的递归分配空间,共 N N N层,需要预留 f l a g flag flag数组的空间。

相似题目

[leetcode] 17. 电话号码的字母组合
[leetcode] 22. 括号生成
[leetcode] 37. 解数独
[leetcode] 38. 外观数列
[leetcode] 39. 组合总和
[leetcode] 40. 组合总和 II


  • 个人公众号
    个人公众号
  • 个人小游戏
    个人小游戏

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

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

相关文章

实验三智能手机互联网程序设计(微信程序方向)实验报告

实验目的和要求 请编写下方商品列表页面&#xff0c;展示商品名称和价格&#xff1b; 二、实验步骤与结果&#xff08;给出对应的代码或运行结果截图&#xff09; Index.WXML <view class"shop" wx:for"{{10}}"> <vie…

何從Microsoft下載Windows 10 最新版本的ISO

許多新手用戶不知道如何從Microsoft下載最新版本的Windows 10 ISO(32 位或 64 位)。在本指南中,我們將向您展示如何直接從Microsoft下載最新版本的Windows 10 ISO。請注意收藏以備不時之需哦。 您可能知道,除了幾個次要更新外,微軟每年都會向 Windows 10 發布兩個主要更新…

阿里云服务器ECS u1实例ecs.u1-c1m2.large性能测评

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

Yarn的安装和使用(2):使用及问题解决

Yarn是JavaScript的依赖管理工具&#xff0c;它与npm类似&#xff0c;但提供了一些额外的性能优化和一致性保证。 Yarn的使用&#xff1a; 初始化项目&#xff1a; yarn init 此命令会引导您创建一个新的package.json文件&#xff0c;用于记录项目的元信息和依赖。 添加依赖&…

如何恢复已删除的 Office 文件

丢失了重要文件并需要将其找回&#xff1f;这些提示将帮助您立即恢复 Office 文档。 没有什么比无法访问您已经处理了几个小时的文档更令人沮丧的了。无论文件是否已损坏、删除或以其他方式丢失&#xff0c;都会感觉浪费了巨大的时间和精力。 幸运的是&#xff0c;使用 Micro…

Apache Hive的基本使用语法(一)

一、数据库操作 创建数据库 create database if not exists myhive;查看数据库 use myhive; desc database myhive;创建数据库并指定hdfs存储 create database myhive2 location /myhive2;删除空数据库&#xff08;如果有表会报错&#xff09; drop database myhive;…

ubuntu之搭建samba文件服务器

1. 在服务器端安装samba程序 sudo apt-get install samba sudo apt-get install smbclient 2.配置samba服务 sudo gedit /etc/samba/smb.conf 在文件末尾追加入以下配置 [develop_share] valid users ancy path /home/ancy public yes writable y…

Python文件操作命令

文件操作 我知道你最近很累&#xff0c;是那种看不见的、身体上和精神上的疲惫感&#xff0c;但是请你一定要坚持下去。就算无人问津也好&#xff0c;技不如人也好&#xff0c;千万别让烦躁和焦虑毁了你的热情和定力。别贪心&#xff0c;我们不可能什么都有&#xff0c;也别灰心…

亚信安全荣获2023年度5G创新应用评优活动两项大奖

近日&#xff0c;“关于2023 年度5G 创新应用评优活动评选结果”正式公布&#xff0c;亚信安全凭借在5G安全领域的深厚积累和创新实践&#xff0c;成功荣获“5G技术创新的优秀代表”和“5G应用创新的杰出实践”两项大奖。 面向异构安全能力的5G安全自动化响应系统 作为5G技术创…

【C语言】结构体详解(一)

目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问&#xff08;两种方式&#xff09; 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明&#xff08;匿…

白色微立体的智能界面,就喜欢这种简洁白净。

本次发一些微立体风格的智能家居界面&#xff0c;风格为微立体&#xff0c;也叫轻拟物风格&#xff0c;或者新拟态风格。

规划控制如何兼顾安全与舒适性

规划控制如何兼顾安全与舒适性 附赠自动驾驶学习资料和量产经验&#xff1a;链接 **导读&#xff1a;**自动驾驶技术研发对于“安全第一”的追求是毋庸置疑的&#xff0c;但是这中间可能就忽视了舒适性。 因此&#xff0c;今天我想给大家分享的是&#xff0c;自动驾驶研发如何…

探究ThreadLocal的魔数0x61c88647和Entry数组

探究ThreadLocal 下面有一个很重要的HASH_INCREMENT,他的值是0x61c88647 public class ThreadLocal<T> {/***ThreadLocals依赖于附加到每个线程的每线程线性探针哈希映射 (thread.threadLocals和inheritableThreadLocals)。ThreadLocal对象充当键&#xff0c;通过threa…

uniApp使用XR-Frame创建3D场景(4)金属度和粗糙度

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这一篇我们讲解xr-frame中关于mesh网格材质的金属度和粗糙度的设置。 1.先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{…

Java使用数组实现栈、队列、堆

数组模拟栈&#xff1a; const int N 10010; // ******************** 栈 int stk[N], tt//tt是下标; // 插入 stk[k] x; // 删除 tt--; // 判断栈是否为空 if (tt > 0) not empty else empty // 栈顶 stk[tt]; // ******************** 队列 // 在队尾插入…

可视化图表:关系图,一图分清父子兄弟关系。

Hi&#xff0c;我是贝格前端工场的老司机&#xff0c;本文分享可视化图表设计的关系图设计&#xff0c;欢迎老铁持续关注我们。 在现代信息爆炸的时代&#xff0c;我们需要从庞大的数据中提取有用的信息和洞察。而可视化图表作为数据分析和展示的重要工具之一&#xff0c;被广泛…

《新机器智能》的深度解读与感悟

《新机器智能》的深度解读与感悟 引言[1] 脑科学对于人工智能研发的意义[2] 新皮质建立了世界模型[3] 记忆-预测模型[4] 记忆-预测模型是如何工作的[5] 意识与创造力[6] 智能的未来1.我们能创造人工智能吗&#xff1f;2.我们应该制造智能机器吗&#xff1f;3.智能机器能做些什么…

Node Sass does not yet support your current environment

项目运行时报错&#xff1a;Node Sass does not yet support your current environment 原因是node版本过高。 解决办法&#xff1a; 使用nvm管理node版本&#xff0c;&#xff08;如何安装nvm&#xff1f;请点击跳转&#xff09; 具体步骤如下&#xff1a; 1.查看当前node…

C++中使用虚函数实现多态

虚函数是C中用于实现多态&#xff08;Polymorphism&#xff09;的重要特性。下面是关于虚函数的讲解和代码示例&#xff1a;### 虚函数的定义&#xff1a; 虚函数是在基类中声明为 virtual 的成员函数。 在派生类中重写&#xff08;override&#xff09;这个虚函数&#xff0c;…

Python编码和字符操作

编码和字符操作 .你觉得&#xff0c;迷茫的反义词是什么&#xff1f;有些人可能会说是坚定&#xff0c;但还有另一种说法&#xff1a;迷茫的反义词是具体。当你从一件件具体的事开始着手&#xff0c;焦虑就会一点点退去。——《夜读》 编码操作 UTF8编码 当谈到字符编码时&am…