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

【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.kler.cn/a/454946.html

相关文章:

  • C++ —— 模板类与友元
  • 数字化什么意思?从基础概念到行业应用的全面解读
  • Linux应用软件编程-多任务处理(进程)
  • 代码随想录Day52 101. 孤岛的总面积,102. 沉没孤岛,103. 水流问题,104.建造最大岛屿。
  • qt+Linux+arm多核CPU 亲和性
  • Python异常处理在“简易记事本”项目中的应用
  • 摄影构图与拍摄
  • XTUOJ 三角数
  • 数据分析篇001
  • 设计模式--装饰器模式【结构型模式】
  • MCS-51单片机常用汇编指令和特殊功能寄存器~
  • STM32开发笔记123:使用FlyMcu下载程序
  • 代码随想录Day49 42. 接雨水,84.柱状图中最大的矩形。
  • macrodroid通过http请求控制手机运行宏
  • Zookeeper下面的lib
  • 初学elasticsearch
  • CompassArena新升级:Judge Copilot提升竞技体验,新一代Bradley-Terry模型还原模型真实能力
  • WebRTC服务质量(11)- Pacer机制(03) IntervalBudget
  • 我的Qt作品(20)使用Qt+OpenCV写一个旋转/抠图/mask生成工具
  • 【初接触】【学习】编译 Rust 为 WebAssembly