当前位置: 首页 > news >正文

【Leetcode 热题 100】46. 全排列

问题背景

给定一个不含重复数字的数组 n u m s nums nums,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

数据约束

  • 1 ≤ n u m s . l e n g t h ≤ 6 1 \le nums.length \le 6 1nums.length6
  • − 10 ≤ n u m s [ i ] ≤ 10 -10 \le nums[i] \le 10 10nums[i]10
  • n u m s nums nums 中的所有整数 互不相同

解题过程

回溯真的老大难,排列问题在递归的过程中是不知道之前元素是否被使用的,要用哈希表来判断是不是已经选择过,同时要注意恢复现场。
或者枚举当前位置可选的元素,用集合来判断,要注意避免并发修改异常。

具体实现

选或不选

class Solution {public List<List<Integer>> permute(int[] nums) {int n = nums.length;List<List<Integer>> res = new ArrayList<>();// 流程中答案是直接在对应位置上进行设置的,需要用这种方式定义有初始长度的列表List<Integer> path = Arrays.asList(new Integer[n]);boolean[] onPath = new boolean[n];dfs(0, nums, res, path, onPath);return res;}private void dfs(int i, int[] nums, List<List<Integer>> res, List<Integer> path, boolean[] onPath) {if(i == nums.length) {res.add(new ArrayList<>(path));return;}// i 枚举可能位置,j 访问可能元素for(int j = 0; j < nums.length; j++) {if(!onPath[j]) {path.set(i, nums[j]);onPath[j] = true;dfs(i + 1, nums, res, path, onPath);onPath[j] = false;}}}
}

选哪一个

class Solution {public List<List<Integer>> permute(int[] nums) {List<List<Integer>> res = new ArrayList<>();List<Integer> path = new ArrayList<>();Set<Integer> set = new HashSet<>();for(int num : nums) {set.add(num);}dfs(0, nums, res, path, set);return res;}private void dfs(int i, int[] nums, List<List<Integer>> res, List<Integer> path, Set<Integer> set) {if(i == nums.length) {res.add(new ArrayList<>(path));return;}// List 中有重载的 remove 方法,表达不同的删除语义,这里必须用包装类型来遍历for(Integer item : set) {path.add(item);Set<Integer> temp = new HashSet<>(set);temp.remove(item);dfs(i + 1, nums, res, path, temp);path.remove(item);}}
}

http://www.mrgr.cn/news/81714.html

相关文章:

  • openfeign自动将Boolean默认为false
  • Firm-Level Climate Change Exposure
  • 设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
  • ARM学习(39)ARM-GCC编译出的Bin文件过大解决方案
  • 深度学习助力股市预测:LSTM、RNN和CNN模型实战解析
  • python EEGPT报错:Cannot cast ufunc ‘clip‘ output from dtype(‘float64‘)
  • 雷电模拟器安装LSPosed
  • 强化学习基础之贝尔曼期望方程
  • -0.4375 IEEE754表示
  • Python+Django 技术实现自动化漏洞扫描系统开发
  • 【Rust自学】7.2. 路径(Path)Pt.1:相对路径、绝对路径与pub关键字
  • Python数据可视化小项目
  • 麒麟操作系统服务架构保姆级教程(六)部署PHP环境
  • Prometheus 专栏 —— Prometheus入门介绍
  • 影视仓最新接口+内置本包方法的研究(2024.12.27)
  • MacOS安装Xcode(非App Store)
  • STM32F103RCT6学习之二:GPIO开发
  • 使用 IDE生成 Java Doc
  • 使用 Three.js 创建圣诞树场景
  • Linux 搭建 nginx+keepalived (主备+双主模式) 高可用 | Nginx反向代理
  • Layui 新增销售单 其中一种 编写逻辑和打开方式
  • linux 中文输入法设置的宏观思路 (****)
  • 数据处理之数据规约
  • 文本数据处理
  • 了解智能运维
  • #渗透测试#漏洞挖掘#红蓝攻防#漏洞挖掘#未授权漏洞-Es未授权漏洞