回溯

全排列

中等#46Java时间 O(n·n!)空间 O(n),不计结果

题目要做什么

返回互异整数数组的所有排列。每个排列使用每个元素恰好一次,结果顺序不限。

题目示例输入nums = [1,2,3]
题目示例输出[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

01 为什么这样做

每层选择一个尚未使用的元素。选择后递归填下一位置,返回时撤销选择和 used 标记,以便探索其他排列。

始终成立的条件

path 中元素互异,used 恰好标记当前路径已使用的位置。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public List<List<Integer>> permute(int[] nums) {3        List<List<Integer>> result = new ArrayList<>();4        search(nums, new boolean[nums.length], new ArrayList<>(), result);5        return result;6    }7    private void search(int[] nums, boolean[] used, List<Integer> path, List<List<Integer>> result) {8        if (path.size() == nums.length) {9            result.add(new ArrayList<>(path));10            return;11        }12        for (int i = 0; i < nums.length; i++) {13            if (used[i]) continue;14            used[i] = true;15            path.add(nums[i]);16            search(nums, used, path, result);17            path.remove(path.size() - 1);18            used[i] = false;19        }20    }21}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索