leetcode----46. Permutations

链接:

https://leetcode.com/problems/permutations/

大意:

给定一个不含重复数字的数字,求以数组中所有元素的所有组合(在每个组合中,每个数字能且只能被使用一次)。例子:

思路:

回溯法。需要借助一个辅助数组boolean[] visited,用于记录每个位置的变量是否已被访问。其余思路和前几题的回溯思路类似,不再累述了。

代码:

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if (nums.length == 0)
            return res;
        boolean[] visited = new boolean[nums.length]; // 用于记录各个位置的元素是否已被访问
        dfs(nums, new LinkedList<Integer>(), res, visited);
        return res;
    }
    public void dfs(int nums[], LinkedList<Integer> list, List<List<Integer>> res, boolean[] visited) {
        if (list.size() == nums.length) {
            res.add(new ArrayList<>(list));
            return ;
        }
        for (int i = 0; i < nums.length; i++) {
            if (!visited[i]) {
                visited[i] = true;
                list.addLast(nums[i]);
                dfs(nums, list, res, visited);
                visited[i] = false;
                list.removeLast();
            }
        }
    }
}

结果:

结论:

很基础的一个回溯问题,与前几个回溯题不同的是:本次回溯题需要使用一个boolean[] 型数组用于记录每个元素是否被访问,回溯的时候除了从list删除最后添加的元素,还得把该元素的访问标志由true改为false。 

 

猜你喜欢

转载自blog.csdn.net/smart_ferry/article/details/88816417