LeetCode100之全排列(46)--Java
1.问题描述
给定一个不含重复数字的数组 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] <= 10nums中的所有整数 互不相同
难度等级
中等
题目链接
全排列
2.解题思路
这道题要求我们返回所有可能的全排列,每一个数都有可能在每一个位置出现,这里我们要用到回溯的思想。
在解题之前,我们要先来定义一些变量,我们的一个排列,可以用一个List集合来表示,我们可以用一个辅助的List集合来寻找所有的全排列,并定义一个用来存储最终所有全排列的List数组(data),接着,我们还需要一个标识数组,来标识nums中的哪些数已经在当前排列中出现过了,防止出现同一个nums[i],在一个排列中排了两次。
List<List<Integer>> data = new ArrayList<>();boolean[] used = new boolean[nums.length];
这道题我们可以编写一个递归+回溯的方法来找到所有的排列。
递归的结束条件是当辅助List的个数等于nums数组的个数时,说明所有的数都已经拿出来进行排列了,已经得到一个新的排列,这时,创建一个新的List将辅助数组的元素存入新的List中,再将List存入最终用来存储所有全排列的List集合中,然后直接返回即可。
//如果list的大小 = nums的个数,说明得到一个排列if(list.size() == nums.length){//添加新的排列data.add(new ArrayList<>(list));return;}
正常的递归逻辑也很简单,用一个for循环对nums数组进行遍历,先判断当前的数是否已经在辅助List排列了,如果已经在List中排列,则跳过这一个数。
//遍历nums数组,将还没排列的数字取出来进行排序for(int i = 0;i < nums.length;i++){//已经被用过的数,直接跳过if(used[i] == true){continue;}......}
如果还没有在参与排列,则将标记改为true并添加到辅助List中,参与排列,接着递归调用当前方法继续进行查找。找到包含当前子排列的所有排列之后,我们还需要对当前的排列进行回溯,将标记重新改回false,并将当前对应的这个数从辅助list中取出,防止对后面的排列造成影响。
//遍历nums数组,将还没排列的数字取出来进行排序for(int i = 0;i < nums.length;i++){......//标记为已使用used[i] = true;//添加到当前的排列中list.add(nums[i]);//递归backtrack(data,list,nums,used);//回溯list.remove(list.size()-1);used[i] = false;}
当递归方法完全执行完成之后,直接将用来存储全排列的List集合(data)返回即可。
backtrack(data,new ArrayList<Integer>(),nums,used);return data;
3.代码展示
class Solution {public List<List<Integer>> permute(int[] nums) {List<List<Integer>> data = new ArrayList<>();boolean[] used = new boolean[nums.length];backtrack(data,new ArrayList<Integer>(),nums,used);return data;}public void backtrack(List<List<Integer>> data,List<Integer> list,int[] nums,boolean[] used){//如果list的大小 = nums的个数,说明得到一个排列if(list.size() == nums.length){//添加新的排列data.add(new ArrayList<>(list));return;}//遍历nums数组,将还没排列的数字取出来进行排序for(int i = 0;i < nums.length;i++){//已经被用过的数,直接跳过if(used[i] == true){continue;}//标记为已使用used[i] = true;//添加到当前的排列中list.add(nums[i]);//递归backtrack(data,list,nums,used);//回溯list.remove(list.size()-1);used[i] = false;}}
}
4.总结
这道题没什么太大的难度,采用回溯+递归的方法穷尽所有的排列可能,让每一个数在每一个位置都出现一次。好了,这道题没啥好啰嗦的,祝大家刷题愉快,早日上岸!
相关文章:
LeetCode100之全排列(46)--Java
1.问题描述 给定一个不含重复数字的数组 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] 输出…...
goframe 博客分类文章模型文档 主要解决关联
goframe 博客文章模型文档 模型结构 (BlogArticleInfoRes) BlogArticleInfoRes 结构体代表系统中的一篇博客文章,包含完整的元数据和内容管理功能。 type BlogArticleInfoRes struct {Id uint orm:"id,primary" json:"id" …...
【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南
文章目录 🌍一. WEB 开发❄️1. 介绍 ❄️2. BS 与 CS 开发介绍 ❄️3. JavaWeb 服务软件 🌍二. Tomcat❄️1. Tomcat 下载和安装 ❄️2. Tomcat 启动 ❄️3. Tomcat 启动故障排除 ❄️4. Tomcat 服务中部署 WEB 应用 ❄️5. 浏览器访问 Web 服务过程详…...
安卓日常问题杂谈(一)
背景 关于安卓开发中,有很多奇奇怪怪的问题,有时候这个控件闪一下,有时候这个页面移动一下,这些对于快速开发中,去查询,都是很耗费时间的,因此,本系列文章,旨在记录安卓…...
Kitchen Racks 2
Kitchen Racks 2 吸盘置物架 Kitchen Racks-CSDN博客...
嵌入式学习笔记-杂七杂八
文章目录 连续波光纤耦合激光器工作原理主要特点应用领域设计考虑因素 数值孔径(Numerical Aperture,简称NA)数值孔径的定义数值孔径的意义数值孔径的计算示例数值孔径与光纤 四象限探测器检测目标方法四象限划分检测目标的步骤1. 数据采集2.…...
14-7C++STL的stack容器
(一)stack容器的入栈与出栈 (1)stack容器的简介 stack堆栈容器,“先进后出”的容器,且stack没有迭代器 (2)stack对象的默认构造 stack采用模板类实现,stack对象的默认…...
Vue 3 中的响应式系统:ref 与 reactive 的对比与应用
Vue 3 的响应式系统是其核心特性之一,它允许开发者以声明式的方式构建用户界面。Vue 3 引入了两种主要的响应式 API:ref 和 reactive。本文将详细介绍这两种 API 的用法、区别以及在修改对象属性和修改整个对象时的不同表现,并提供完整的代码…...
物业巡更系统助推社区管理智能化与服务模式创新的研究与应用
内容概要 在现代社区管理中,物业巡更系统扮演着至关重要的角色。首先,我们先来了解一下这个系统的概念与发展背景。物业巡更系统,顾名思义,是一个用来提升物业管理效率与服务质量的智能化工具。随着科技的发展,传统的…...
windows蓝牙驱动开发-生成和发送蓝牙请求块 (BRB)
以下过程概述了配置文件驱动程序生成和发送蓝牙请求块 (BRB) 应遵循的一般流程。 BRB 是描述要执行的蓝牙操作的数据块。 生成和发送 BRB 分配 IRP。 分配BRB,请调用蓝牙驱动程序堆栈导出以供配置文件驱动程序使用的 BthAllocateBrb 函数。;初始化 BRB…...
Linux网络之序列化和反序列化
目录 序列化和反序列化 上期我们学习了基于TCP的socket套接字编程接口,并实现了一个TCP网络小程序,本期我们将在此基础上进一步延伸学习,实现一个网络版简单计算器。 序列化和反序列化 在生活中肯定有这样一个情景。 上图大家肯定不陌生&a…...
linux设置mysql远程连接
首先保证服务器开放了mysql的端口 然后输入 mysql -u root -p 输入密码后即可进入mysql 然后再 use mysql; select user,host from user; update user set host"%" where user"root"; flush privileges; 再执行 select user,host from user; 即可看到变…...
react-native网络调试工具Reactotron保姆级教程
在React Native开发过程中,调试和性能优化是至关重要的环节。今天,就来给大家分享一个非常强大的工具——Reactotron,它就像是一个贴心的助手,能帮助我们更轻松地追踪问题、优化性能。下面就是一份保姆级教程哦! 一、…...
erase() 【删数函数】的使用
**2025 - 01 - 25 - 第 48 篇 【函数的使用】 作者(Author) 文章目录 earse() - 删除函数一. vector中的 erase1 移除单个元素2 移除一段元素 二. map 中的erase1 通过键移除元素2 通过迭代器移除元素 earse() - 删除函数 一. vector中的 erase vector 是一个动态数组&#x…...
性能测试丨内存火焰图 Flame Graphs
内存火焰图的基本原理 内存火焰图是通过分析堆栈跟踪数据生成的一种图形化表现,能够展示应用程序在运行时各个函数的内存占用情况。火焰图的宽度代表了函数占用的内存量,而火焰的高度则显示了函数在调用栈中的层级关系。通过这种可视化方式,…...
AIGC的企业级解决方案架构及成本效益分析
AIGC的企业级解决方案架构及成本效益分析 一,企业级解决方案架构 AIGC(人工智能生成内容)的企业级解决方案架构是一个多层次、多维度的复杂系统,旨在帮助企业实现智能化转型和业务创新。以下是总结的企业级AIGC解决方案架构的主要组成部分: 1. 技术架构 企业级AIGC解决方…...
Linux 入门 常用指令 详细版
欢迎来到指令小仓库!! 宝剑锋从磨砺出,梅花香自苦寒来 什么是指令? 指令和可执行程序都是可以被执行的-->指令就是可执行程序。 指令一定是在系统的每一个位置存在的。 1.ls指令 语法: ls [选项][目…...
【R语言】流程控制
R语言中,常用的流程控制函数有:repeat、while、for、if…else、switch。 1、repeat循环 repeat函数经常与 break 语句或 next 语句一起使用。 repeat ({x <- sample(c(1:7),1)message("x ", x, ",你好吗?")if (x …...
猿人学第一题 js混淆源码乱码
首先检查刷新网络可知,m参数被加密,这是一个ajax请求 那么我们直接去定位该路径 定位成功 观察堆栈之后可以分析出来这应该是一个混淆,我们放到解码平台去还原一下 window["url"] "/api/match/1";request function…...
计算机组成原理(2)王道学习笔记
数据的表示和运算 提问:1.数据如何在计算机中表示? 2.运算器如何实现数据的算术、逻辑运算? 十进制计数法 古印度人发明了阿拉伯数字:0,1,2,3,4,5,6&#…...
Cyber Engine Tweaks:解决《赛博朋克2077》性能瓶颈与脚本扩展的技术方案
Cyber Engine Tweaks:解决《赛博朋克2077》性能瓶颈与脚本扩展的技术方案 【免费下载链接】CyberEngineTweaks Cyberpunk 2077 tweaks, hacks and scripting framework 项目地址: https://gitcode.com/gh_mirrors/cy/CyberEngineTweaks Cyber Engine Tweaks …...
颠覆式效率工具:BaiduPanFilesTransfers重构百度网盘批量管理流程
颠覆式效率工具:BaiduPanFilesTransfers重构百度网盘批量管理流程 【免费下载链接】BaiduPanFilesTransfers 百度网盘批量转存、分享和检测工具 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduPanFilesTransfers 在数字化办公与资源管理场景中ÿ…...
用快马AI快速原型:30分钟搭建养龙虾智能养殖管理系统
用快马AI快速原型:30分钟搭建养龙虾智能养殖管理系统 养龙虾作为现代农业养殖项目,管理流程的数字化能显著提升养殖效率。最近我用InsCode(快马)平台快速搭建了一个智能养殖管理系统原型,整个过程比想象中简单很多。下面分享我的实现思路和关…...
千问3.5-2B部署教程(低成本GPU方案):单卡24GB显存跑通开源VL模型实录
千问3.5-2B部署教程(低成本GPU方案):单卡24GB显存跑通开源VL模型实录 1. 千问3.5-2B模型介绍 千问3.5-2B是Qwen系列中的小型视觉语言模型(VL),它能够同时理解图片内容和处理自然语言。这个模型特别适合那些需要在有限硬件资源上…...
从IDEA到K8s:飞算JavaAI如何打通微服务开发的“最后一公里”
云原生时代的一站式开发革命:当JavaAI遇上Kubernetes 在数字化转型的浪潮中,微服务架构已成为企业技术栈的标配,但随之而来的开发复杂度却让许多团队陷入"最后一公里"困境。传统开发流程中,从本地编码到云端部署需要跨…...
PDF-Extract-Kit-1.0效果展示:高精度表格识别与公式还原真实案例集
PDF-Extract-Kit-1.0效果展示:高精度表格识别与公式还原真实案例集 想象一下,你手头有一份满是复杂表格和数学公式的PDF学术论文,或者一份财务报告。你需要把里面的数据提取出来,做成Excel表格进行分析,或者把那些复杂…...
Phi-4-mini-reasoning应用场景:AI竞赛教练系统自动出题与解析
Phi-4-mini-reasoning应用场景:AI竞赛教练系统自动出题与解析 1. 引言:当AI遇见竞赛训练 想象一下,一位数学竞赛教练每天需要: 设计不同难度的题目准备详细的解题步骤针对学生错误提供个性化解析不断更新题库保持新鲜度 传统方…...
Vertex AI 漏洞暴露谷歌云数据和非公开制品
聚焦源代码安全,网罗国内外最新资讯!编译:代码卫士网络安全研究人员披露称谷歌云 Vertex AI 平台中存在一个安全“盲点”,可使攻击者将人工智能代理武器化,从而未经授权访问敏感数据并危及组织机构的云环境安全。Palo …...
从Linux内核页表映射到用户态HugeTLB池:金融级C++内存池的7层硬件协同优化法(仅限TOP20对冲基金内部文档解密版)
第一章:金融高频交易C内存池的硬件协同优化全景图在纳秒级响应要求的金融高频交易系统中,C内存池不再仅是软件抽象层的性能补丁,而是CPU缓存子系统、内存控制器与DRAM物理特性的协同执行面。现代x86-64平台(如Intel Ice Lake-SP或…...
AgentCPM深度研报助手使用技巧:三个参数让报告更专业
AgentCPM深度研报助手使用技巧:三个参数让报告更专业 1. 为什么你的AI研报总像“流水账”?问题可能出在参数上 你用过AI写报告,结果是不是这样:内容看起来都对,但读起来总觉得“差点意思”?结构松散像拼凑…...
