全排列(中等难度)

简介: 全排列(中等难度)

目录

题目概述(中等难度)

思路与代码

思路展现

代码示例

题目概述(中等难度)

2.png


题目链接:

点我进入链接


思路与代码

思路展现

这道题目就是经典的回溯+DFS(深度优先搜索遍历),在这里我就不再给出我关于回溯的讲解了,leetcode的大佬已经帮我们总结到位了,只需要跟着他的题解走即可,在这里宣传以下weiwei大佬是一位非常厉害的大佬,除了他自己写的题解意外,也开设了自己的github网站帮助大家学习算法,在这里我都会将其网站贴到下面:

全排列weiwei大佬题解链接

weiwei大佬github链接

同时关于全排列这道题目大家如果觉得直接看题解上手比较有难度的话,推荐大家可以直接看下面的一个B站up主来带大家入门:

点我进入B站

顺带介绍以下回溯三部曲:

2.png


同时关于什么是DFS和BFS我也给出大家一个链接:

点我来看BFS和DFS


代码示例

class Solution {
    public List<List<Integer>> permute(int[] nums) {
       //len代表数组的长度
       int len = nums.length;
       //path是一个双端队列,设置成这个的原因是Java官方Stack类的建议
       Deque<Integer> path = new LinkedList<>();
       //设置我们的res
       List<List<Integer>> res = new ArrayList<>();
       //设置我们所给定的nums数组中每个元素的初始状态为false
       boolean[] used = new boolean[len];
       if(len == 0) {
           return res;
       }
       dfs(path,used,nums,res,0,len);
       return res;
    }
    /*
    dfs方法参数介绍:
    path表示双端队列,用于存储我们所选择的路径上的数字
    boolean数组用于表示数字的选择与被选择,被选择为true,没有为false
    res用于存储最后的返回结果
    我们递归结束的条件与我们nums数组的长度len以及二叉树深度depth有很大的关系
    */
    public void dfs(Deque<Integer> path , boolean[] used , int[] nums , List<List<Integer>> res , int depth , int len) {
       if(depth == len) {
           //注意这里的写法其实是一个简便写法,就是直接实例化一个list集合然后将双端队列参数直接传入进去
           res.add(new ArrayList<>(path));
           //声明我们的递归终止条件
           return;
       }
       //!used[i]就表示此时假设这个数字还没有被选中,它的反就一定为true,然后才能进入到下面的语句
           for(int i = 0 ; i < len ; i++) { 
               if(!used[i]) {
               //选中后将数字加入到path中
               path.addLast(nums[i]);
               //选中后将状态置为true
               used[i] = true;
               //上面我们选择元素完毕后就开始我们的递归
               dfs(path,used,nums,res,depth + 1,len);
               //进行完递归操作后接下来就需要我们进行撤回操作
               //1:撤回操作的第一步是将状态置为false
               used[i] = false;
               //2:撤回操作的第二步是将数字从path中移除
               path.removeLast();
           }
       }
    }
}

注意:


写成res.add(new ArrayList<>(path))的原因是当我们写成res.add(path)的时候,因为path每次都会更改,所以如果只写一个path的话相当于只有一个符合条件的全排列会被放到res当中去,而当我们写new ArrayList<>(path)的时候,相当于每次都会在堆上开辟一个空间去存储我们符合条件的全排列,所以最终结果是res会存储我们所有符合条件的全排列.


相关文章
|
存储 SQL 分布式计算
开源大数据比对平台设计与实践—dataCompare
开源大数据比对平台设计与实践—dataCompare
511 0
|
网络协议 物联网 开发者
NB-IoT 通信之 TCP 收发数据 | 学习笔记
快速学习 NB-IoT 通信之 TCP 收发数据
NB-IoT 通信之 TCP 收发数据 | 学习笔记
|
JavaScript 前端开发 安全
怎样用Node.js搭建web服务器
本文探讨了如何使用Node.js构建高效的HTTP服务器。首先,介绍了HTTP常见请求方法,如GET、POST、PUT等。接着,展示了如何使用Node.js的`http`模块创建服务器,并根据请求方法进行不同处理,如判断GET和POST请求,以及获取GET请求参数和处理POST请求数据。最后,讨论了服务器代码的模块化管理,包括路由管理和业务逻辑拆分,以提升代码的维护性和扩展性。通过本文,读者可以掌握基础的Node.js服务器开发及模块化设计技巧。
291 0
|
11月前
|
数据采集 人工智能 缓存
腾讯混元又来开源,一出手就是最大MoE大模型
腾讯混元团队近日发布了开源Transformer-based MoE模型Hunyuan-Large,参数量达3890亿,激活参数520亿,处理tokens高达256K。该模型在多个基准测试中超越LLama3.1-70B,在某些方面媲美更大规模的LLama3.1-405B。其成功源于合成数据集、混合专家路由策略、键值缓存压缩及专家特定学习率等创新技术。尽管面临训练成本高和数据质量等挑战,Hunyuan-Large仍为AI行业注入新活力,并推动技术进步与应用创新。
211 13
|
设计模式 算法 Java
泛型策略模式的介绍和使用!
泛型策略模式的介绍和使用!
184 1
泛型策略模式的介绍和使用!
|
存储 固态存储
用阿里云“无影”搭建《黑神话:悟空》电脑环境
《黑神话:悟空》是一款高质国风游戏,对硬件有一定要求,例如64位系统、Intel Core i5-8400或AMD Ryzen 5 1600处理器、NVIDIA GeForce GTX 1060 6GB或AMD Radeon RX 580 8GB显卡以及16GB RAM等。阿里云无影是一种云电脑服务,用户可通过无影盒子连接云端电脑实现远程办公或娱乐,主要面向企业用户降低成本并提供便捷方案。无影云电脑提供含基本配置与功能的试用版,允许用户免费体验一个月,以便评估产品适用性。试用涉及的具体步骤包括访问阿里云免费试用页面、配置相关信息如时长用尽策略及分配用户邮箱等,配置完成后可立即购买开始体验。
1656 3
用阿里云“无影”搭建《黑神话:悟空》电脑环境
|
人工智能 算法
AI 写歌词,会让歌词创作变得更容易吗?
在科技迅猛发展的今天,AI已渗透至多个领域,包括歌词创作。《妙笔生词智能写歌词软件》通过强大算法与海量数据,为新手提供创作指导,快速生成多风格歌词片段,降低创作门槛,节省时间。尽管如此,优秀作品仍需创作者的情感与思考,AI辅助下的歌词创作正逐渐变得更为便捷。
|
Java
Java Character 类详解
`Character` 类是 Java 中的一个封装类,位于 `java.lang` 包中,主要用于处理单个字符。它是一个最终类,提供了多种静态方法来检查和操作字符属性,如判断字符是否为字母、数字或空格,以及转换字符的大小写等。此外,`Character` 类还支持自动装箱和拆箱,简化了 `char` 和 `Character` 之间的转换。以下是一些示例代码,展示了如何使用 `Character` 类的方法来检查字符属性和执行字符转换。掌握 `Character` 类的用法有助于更高效地处理字符数据。
672 2
|
资源调度 Kubernetes 应用服务中间件
Deployment的创建、滚动更新、回滚版本、扩容缩容
Deployment的创建、滚动更新、回滚版本、扩容缩容
544 1
|
程序员 开发者 Python
Python新手常见问题五:如何避免模块导入错误?
在Python编程中,模块的导入是每个开发者必须掌握的基础技能之一。模块化设计让代码更加有序、可复用和易于维护。然而,在实际操作过程中,新手程序员常常会遇到一些关于模块导入的问题,导致程序无法正常运行。本文将探讨几种常见的模块导入场景及容易犯错的操作,并提供相应的解决方案。
1628 4