欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

有意思的算法题——全排列

程序员文章站 2024-03-13 08:13:03
...

题目描述
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

解题

public class Solution {
    public List<List<Integer>> permute(int[] nums){
        int len = nums.length;
        List<List<Integer>> res = new ArrayList<>();
        if(len == 0){
            return res;
        }

        boolean[] used = new boolean[len];
        Deque<Integer> path = new ArrayDeque<>(len);

        dfs(nums, len, 0, path, used, res);
        return res;
    }

    private void dfs(int[] nums, int len, int depth, Deque<Integer> path, boolean[] used, List<List<Integer>> res){
        if(depth == len){
            res.add(new ArrayList<>(path));
            return;
        }
        for(int i = 0; i < len; i++){
            if(!used[i]){
                path.addLast(nums[i]);
                used[i] = true;
                dfs(nums, len, depth + 1, path, used, res);
                used[i] = false;
                path.removeLast();
            }
        }
    }
}

有意思的算法题——全排列
我们的任务就是遍历这颗树,记录路径上的数字,这就是所有的全排列。
我们采用深度优先遍历。
代码分析
首先创建一个res数组保存所有的全排列,创建used数组是为了查看哪些数字已经选了,哪些数字还没有选,比如当走到节点1树,你有两种选择(2或者3),你选择了2,当回溯到节点1时,这时就不能选择2了,只能选择3。path是一个栈,代表走过的路径,就是一个排列。进入递归函数,结束条件是遍历到最底层,也就是当数组长度等于树的高度。
接下来的for循环用下图来说明
有意思的算法题——全排列
这是for的逻辑,也是这段代码的核心。

相关标签: 算法