46. 全排列[中等]

115 阅读1分钟

题目

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

解法

代码

    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new LinkedList<>();
        Map<Integer, Boolean> visited = new HashMap<>();
        for (int num : nums) {
            visited.put(num, false);
        }
        List<Integer> list = new LinkedList<>();
        backTracking(nums, res, visited, list);
        
        return res;
    }
    
    private void backTracking(int[] nums, List<List<Integer>> res, Map<Integer, Boolean> visited, List<Integer> list) {
        if (nums.length == list.size()) {
            res.add(new LinkedList<>(list));
            return;
        }
        for (int num : nums) {
            if (visited.get(num)) {
                continue;
            }
            list.add(num);
            visited.put(num, true);
            backTracking(nums, res, visited, list);
            list.remove(list.size()-1);
            visited.put(num, false);
        }
    }

update20220714

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new LinkedList<>();
        backtracking(nums, res, new LinkedList<>());
        return res;
    }

    private void backtracking(int[] nums, List<List<Integer>> res, List<Integer> list) {
        if (list.size() == nums.length) {
            res.add(new LinkedList<>(list));
            return;
        }

        for (int num : nums) {
            if (list.indexOf(num) == -1) {
                list.add(num);
                backtracking(nums, res, list);
                list.remove(list.size() - 1);
            }
        }
    }
}

参考

-# Leetcode力扣46 手画图解版|全排列 Permutation