LeetCode47
LeetCode47
目录
- 题目描述
- 示例
- 思路分析
- 代码段
- 代码逐行讲解
- 复杂度分析
- 总结的知识点
- 整合
- 总结
题目描述
给定一个可包含重复数字的整数数组 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]
]
思路分析
问题核心
我们需要找到数组中所有不重复的全排列。由于数组可能包含重复数字,因此需要避免生成重复的排列。
思路拆解
- 排序:
- 将数组排序,使相同的数字相邻,方便后续去重。
- 深度优先搜索(DFS):
- 使用 DFS 遍历所有可能的排列。
- 剪枝:
- 在 DFS 过程中,如果当前数字与前一个数字相同,并且前一个数字未被使用,则跳过当前数字,避免重复排列。
- 回溯:
- 在 DFS 过程中,使用
visited数组标记已使用的数字,并在回溯时取消标记。
- 在 DFS 过程中,使用
代码段
class Solution {public List<List<Integer>> permuteUnique(int[] nums) {Arrays.sort(nums); List<List<Integer>> res = new ArrayList<>();dfs(nums, new boolean[nums.length], new LinkedList<>(), res); return res;}private static void dfs(int[] nums, boolean[] visited, LinkedList<Integer> stack, List<List<Integer>> res) {if (stack.size() == nums.length) { res.add(new ArrayList<>(stack));return;}for (int i = 0; i < nums.length; i++) {if (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1]) {continue;}if (!visited[i]) { stack.push(nums[i]); visited[i] = true; dfs(nums, visited, stack, res); visited[i] = false; stack.pop();}}}
}

代码逐行讲解
1. 排序
Arrays.sort(nums);
- 将数组排序,使相同的数字相邻,方便后续去重。
2. 初始化结果列表
List<List<Integer>> res = new ArrayList<>();
res用于存储所有不重复的排列。
3. 调用 DFS
dfs(nums, new boolean[nums.length], new LinkedList<>(), res);
- 调用 DFS 函数,传入数组
nums、visited数组(用于标记已使用的数字)、stack(用于存储当前排列)和结果列表res。
4. DFS 函数
private static void dfs(int[] nums, boolean[] visited, LinkedList<Integer> stack, List<List<Integer>> res) {
- DFS 函数的定义,用于递归生成排列。
5. 找到一个排列
if (stack.size() == nums.length) {res.add(new ArrayList<>(stack));return;
}
- 如果当前排列的长度等于数组长度,说明找到一个完整的排列,将其加入结果列表。
6. 遍历数组
for (int i = 0; i < nums.length; i++) {
- 遍历数组中的每个数字,尝试将其加入当前排列。
7. 剪枝:避免重复排列
if (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1]) {continue;
}
- 如果当前数字与前一个数字相同,并且前一个数字未被使用,则跳过当前数字,避免重复排列。
8. 加入当前数字
if (!visited[i]) {stack.push(nums[i]);visited[i] = true;
- 如果当前数字未被使用,将其加入当前排列,并标记为已使用。
9. 递归
dfs(nums, visited, stack, res);
- 递归调用 DFS,继续生成下一个数字的排列。
10. 回溯
visited[i] = false;
stack.pop();
- 回溯时取消当前数字的标记,并将其从当前排列中移除。
复杂度分析
时间复杂度
- 全排列的数量为
O(n!),其中n是数组的长度。 - 每次生成一个排列需要
O(n)的时间。 - 因此,总时间复杂度为 O(n * n!)。
空间复杂度
- 需要存储所有排列,空间复杂度为 O(n * n!)。
- 递归栈的深度为
n,因此额外空间复杂度为 O(n)。
总结的知识点
1. 排序
- 使用
Arrays.sort对数组进行排序,方便后续去重。
2. 深度优先搜索(DFS)
- 使用 DFS 遍历所有可能的排列。
3. 剪枝
- 在 DFS 过程中,通过条件判断避免生成重复的排列。
4. 回溯
- 在 DFS 过程中,使用
visited数组标记已使用的数字,并在回溯时取消标记。
整合
class Solution {public List<List<Integer>> permuteUnique(int[] nums) {Arrays.sort(nums); // 排序List<List<Integer>> res = new ArrayList<>(); // 结果列表dfs(nums, new boolean[nums.length], new LinkedList<>(), res); // DFSreturn res;}private static void dfs(int[] nums, boolean[] visited, LinkedList<Integer> stack, List<List<Integer>> res) {if (stack.size() == nums.length) { // 找到一个排列res.add(new ArrayList<>(stack));return;}// 遍历 nums 数组for (int i = 0; i < nums.length; i++) {// 剪枝:避免重复排列if (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1]) {continue;}if (!visited[i]) { // 如果当前数字未被使用stack.push(nums[i]); // 加入当前排列visited[i] = true; // 标记为已使用dfs(nums, visited, stack, res); // 递归visited[i] = false; // 回溯stack.pop(); // 移除当前数字}}}
}
总结
这段代码通过排序、DFS 和剪枝,能够高效地生成所有不重复的全排列。
相关文章:
LeetCode47
LeetCode47 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结 题目描述 给定一个可包含重复数字的整数数组 nums,按任意顺序返回所有不重复的全排列。 示例 示例 1 输入: nums [1, 1, 2]输出: [[1, 1, 2],[1, 2, 1],[2, 1, 1] ]…...
C++中std::condition_variable_any、std::lock_guard 和 std::unique_
1、背景 在 C 多线程编程中,同步 和 互斥 是至关重要的概念。C 标准库提供了多种同步机制,其中 std::condition_variable_any、std::lock_guard 和 std::unique_lock 是经常被用到的工具。本文将详细介绍这三者的用途、区别、适用场景,并通过…...
详解AbstractQueuedSynchronizer(AQS)源码
引言 上篇文章讲解了CountDownLatch源码,底层是继承了AQS基类调用父类和重写父类方法实现的,本文将简介AQS源码和架构设计,帮助我们更深入理解多线程实战。 源码架构 1. 状态变量 state AQS 使用一个 int 类型的变量 state 来表示同步状态…...
【Unity动画】导入动画资源到项目中,Animator播放角色动画片段,角色会跟随着动画播放移动。
导入动画资源到项目中,Animator播放角色动画片段,角色会跟随着动画播放移动,但我只想要角色在原地播放动画。比如:播放一个角色Run动画,希望角色在原地奔跑,而不是产生了移动距离。 问题排查: 1.是否勾选…...
图解循环神经网络(RNN)
目录 1.循环神经网络介绍 2.网络结构 3.结构分类 4.模型工作原理 5.模型工作示例 6.总结 1.循环神经网络介绍 RNN(Recurrent Neural Network,循环神经网络)是一种专门用于处理序列数据的神经网络结构。与传统的神经网络不同,…...
【数据结构】(9) 优先级队列(堆)
一、优先级队列 优先级队列不同于队列,队列是先进先出,优先级队列是优先级最高的先出。一般有两种操作:返回最高优先级对象,添加一个新对象。 二、堆 2.1、什么是堆 堆也是一种数据结构,是一棵完全二叉树,…...
4、IP查找工具-Angry IP Scanner
在前序文章中,提到了多种IP查找方法,可能回存在不同场景需要使用不同的查找命令,有些不容易记忆,本文将介绍一个比较优秀的IP查找工具,可以应用在连接树莓派或查找IP的其他场景中。供大家参考。 Angry IP Scanner下载…...
【Linux】命令操作、打jar包、项目部署
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:Xshell下载 1:镜像设置 二:阿里云设置镜像Ubuntu 三…...
瑞萨RA-T系列芯片ADCGPT功能模块的配合使用
在马达或电源工程中,往往需要采集多路AD信号,且这些信号的优先级和采样时机不相同。本篇介绍在使用RA-T系列芯片建立马达或电源工程时,如何根据需求来设置主要功能模块ADC&GPT,包括采样通道打包和分组,GPT触发启动…...
python爬虫系列课程1:初识爬虫
python爬虫系列课程1:初识爬虫 一、爬虫的概念二、通用爬虫和自定义爬虫的区别三、开发语言四、爬虫流程一、爬虫的概念 网络爬虫(又被称为网页蜘蛛、网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动抓取互联网信息的程序。原则上,只要是…...
【笔记】Huggingface Transformers 库加载预训练模型的 4 种方式
Transformers 库加载预训练模型的 4 种方式 Hugging Face Transformers 库提供了 4 种核心代码范式用于加载预训练大语言模型(LLM),具体分类如下: 通用模型加载(无任务头) 使用 AutoModel 加载基础架构&a…...
Unity Shader学习6:多盏平行光+点光源 ( 逐像素 ) 前向渲染 (Built-In)
0 、分析 在前向渲染中,对于逐像素光源来说,①ForwardBase中只计算一个平行光,其他的光都是在FowardAdd中计算的,所以为了能够渲染出其他的光照,需要在第二个Pass中再来一遍光照计算。 而有所区别的操作是࿰…...
tailwindcss学习01
系列教程 01 入门 02 vue中接入 入门 # 注意使用cmd不要powershell npm init -y # 如果没有npx则安装 npm install -g npx npm install -D tailwindcss3.4.17 --registry http://registry.npm.taobao.org npx tailwindcss init修改tailwind.config.js /** type {import(tai…...
DIN:引入注意力机制的深度学习推荐系统,
实验和完整代码 完整代码实现和jupyter运行:https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 在电商与广告推荐场景中,用户兴趣的多样性和动态变化是核心挑战。传统推荐模型(如Embedding &…...
【前端】如何安装配置WebStorm软件?
文章目录 前言一、前端开发工具WebStorm和VS Code对比二、官网下载三、安装1、开始安装2、选择安装路径3、安装选项4、选择开始菜单文件夹5、安装成功 四、启动WebStorm五、登录授权六、开始使用 前言 WebStorm 是一款由 JetBrains 公司开发的专业集成开发环境(IDE…...
【Golang学习之旅】Go 语言微服务架构实践(gRPC、Kafka、Docker、K8s)
文章目录 1. 前言:为什么选择Go语言构建微服务架构1.1 微服务架构的兴趣与挑战1.2 为什么选择Go语言构建微服务架构 2. Go语言简介2.1 Go 语言的特点与应用2.2 Go 语言的生态系统 3. 微服务架构中的 gRPC 实践3.1 什么是 gRPC?3.2 gRPC 在 Go 语言中的实…...
Spring核心思想之—AOP(面向切面编程)
目录 一 .AOP概述 二. Spring AOP 使用 2.1 引入AOP依赖 2.2 编写AOP程序 三. Spring AOP详情 3.1 切点(Pointcut) 3.2 连接点(Join Point) 3.3通知(Advice) 3.4切面(Aspect) 3.5通知 3.6 PointCut (公共切点)…...
使用 Openpyxl 操作 Excel 文件详解
文章目录 安装安装Python3安装 openpyxl 基础操作1. 引入2. 创建工作簿和工作表3. 写入数据4. 保存工作簿5. 加载已存在的Excel6. 读取单元格的值7. 选择工作表 样式和格式化1. 引入2. 设置字体3. 设置边框4. 填充5. 设置数字格式6. 数据验证7. 公式操作 性能优化1. read_only/…...
关于使用雪花算法生成唯一ID,返回给前端ID不一致的问题
问题 在某个项目中,使用雪花算法生成的唯一ID,从数据库查询到数据后返回给前端,但是前端接受到的数据ID和数据库原先生成的不一致 但是前端展示的数据: 原因 原因是后端使用Long类型来存储雪花算法生成的ID,但是这个数值已经超过前端数值类型的范围,导致前端在存储这个数值…...
axios post请求 接收sse[eventsource]数据的
axios 接收sse数据的 axios 接收sse数据的 EventSource什么 基于 HTTP 协议实现,通过与服务器建立一个持续连接,实现了服务器向客户端推送事件数据的功能。在客户端,EventSource 对象通过一个 URL 发起与服务器的连接。连接成功后࿰…...
Spring Boot 示例项目:从零开始构建 Web 应用
一、项目概述 本文档将指导您通过一个示例项目,了解如何使用 Spring Boot 框架构建一个简单的 Web 应用程序。该项目涵盖了从数据模型定义到控制器、服务层以及数据访问层的完整开发流程,帮助您快速掌握 Spring Boot 的基本使用方法。 二、项目结构 1. 项目模块 本示例项…...
大语言模型常用微调与基于SFT微调DeepSeek R1指南
概述 大型语言模型(LLM,Large Language Model)的微调(Fine-tuning)是指在一个预训练模型的基础上,使用特定领域或任务的数据对模型进行进一步训练,以使其在该领域或任务上表现更好。微调是迁移…...
聚焦地灾防治,助力城市地质安全风险防控
城市是人类社会发展的重要载体,承载着经济繁荣、文化交流和人口聚集等重要功能。然而,由于城市建设过程中地质条件复杂,地质灾害风险隐患存在,城市地质安全等问题日益突出,引起人们的广泛关注。为保障城市发展的安全和…...
为什么WP建站更适合于谷歌SEO优化?
在当今数字时代,建立一个网站似乎变得容易,但要构建一个真正能够带来流量和订单的网站却并非易事。特别是在谷歌SEO优化方面,不同的建站程序在SEO支持方面的效果差异显著。对于希望提升搜索引擎表现的用户来说,WordPress无疑是最佳…...
基于JavaScript的实时数据监控仪表盘开发实践
基于JavaScript的实时数据监控仪表盘开发实践 一、项目背景 某云计算服务商需要为其客户提供服务器集群健康状态监控系统。原有系统存在以下痛点: 数据刷新依赖手动操作可视化效果单一(仅表格展示)缺乏异常状态的智能预警移动端适配性差 …...
同步异步日志系统-日志落地模块的实现
功能:将格式化完成后的日志消息字符串,输出到指定的位置 扩展:支持同时将日志落地到不同的位置 位置分类: 1.标准输出 2.指定文件(时候进行日志分析) 3.滚动文件(文件按照时间/大小进行滚动…...
大模型常识:什么是大模型/大语言模型/LLM
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 一、什么是语言模型? 那么什么是语言模…...
用deepseek学大模型08-长短时记忆网络 (LSTM)
deepseek.com 从入门到精通长短时记忆网络(LSTM),着重介绍的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据, 模型应用场景和优缺点,及如何改进解决及改进方法数据推导…...
IOT通道MQTT
IoT通道是物联网(IoT)系统中用于设备与云端或设备之间通信的专用通道,其主要作用是实现数据的高效传输和设备的远程控制。以下是关于IoT通道的定义、应用和技术特点的总结: 定义 IoT通道是物联网设备与云端或设备之间建立的通信…...
(蓝桥杯——10. 小郑做志愿者)洛斯里克城志愿者问题详解
题目背景 小郑是一名大学生,她决定通过做志愿者来增加自己的综合分。她的任务是帮助游客解决交通困难的问题。洛斯里克城是一个六朝古都,拥有 N 个区域和古老的地铁系统。地铁线路覆盖了树形结构上的某些路径,游客会询问两个区域是否可以通过某条地铁线路直达,以及有多少条…...
