【28.全排列】

21 阅读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]]

题解

方式一:回溯

复杂度:不会算

public List<List<Integer>> permute(int[] nums) {
    List<List<Integer>> result = new ArrayList<>();
    boolean[] used = new boolean[nums.length]; // 标记数组
    backtrack(nums, used, new ArrayList<>(), result);
    return result;
}

public void backtrack(int[] nums, boolean[] used, List<Integer> out, List<List<Integer>> result) {
    if (out.size() == nums.length) {
        // 满足条件,加入结果中
        result.add(new ArrayList<>(out));
        return;
    }
    for (int i = 0; i < nums.length; i++) {
        if (used[i]) {
            continue;
        }
        // 找到下一个未加入的元素
        used[i] = true;
        out.add(nums[i]);
        backtrack(nums, used, out, result);
        // 移除最后一个元素
        used[i] = false;
        out.remove(out.size() - 1);
    }
}

总结

算法:回溯用于找出所有解