「力扣」第 46 题:全排列


「力扣」第 46 题:全排列

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例

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

思路:

  • 第 46 题是回溯搜索算法的入门问题,可以把搜索全排列的过程画成一棵递归树;
  • 请务必动手在纸上画出递归树。

Java 代码:

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

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;
        }

        Deque<Integer> path = new ArrayDeque<>(len);
        boolean[] used = new boolean[len];
        dfs(nums, len, path, used, res);
        return res;
    }

    private void dfs(int[] nums, int len, Deque<Integer> path, boolean[] used, List<List<Integer>> res) {
        if (path.size() == len) {
            res.add(new ArrayList<>(path));
            return;
        }

        for (int i = 0; i < len; i++) {
            if (used[i]) {
                continue;
            }

            path.addLast(nums[i]);
            used[i] = true;

            dfs(nums, len, path, used, res);

            used[i] = false;
            path.removeLast();
        }
    }
}

(本节完)


文章作者: liweiwei1419
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liweiwei1419 !
评论
 上一篇
「力扣」第 47 题:全排列 II 「力扣」第 47 题:全排列 II
「力扣」第 47 题:全排列 II 链接 题解链接(含视频讲解) 给定一个可包含重复数字的序列,返回所有不重复的全排列。 示例: 输入: [1, 1, 2] 输出: [ [1, 1, 2], [1, 2, 1], [2, 1
下一篇 
「力扣」第 113 题:路径总和 II 「力扣」第 113 题:路径总和 II
「力扣」第 113 题:路径总和 II 中文网址:113. 路径总和 II ; 英文网址:113. Path Sum II ; 题解链接:回溯算法(深度优先遍历 + 状态重置) 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径
  目录