leetcode刷题(87)——46. 全排列

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

示例:

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

回溯算法的套路

for 选择 in 选择列表:
    # 做选择
    将该选择从选择列表移除
    路径.add(选择)
    backtrack(路径, 选择列表)
    # 撤销选择
    路径.remove(选择)
    将该选择再加入选择列表

于是我自己写的代码如下:

class Solution {
    private List<List<Integer>> result = new ArrayList<List<Integer>>();
    public List<List<Integer>> permute(int[] nums) {
        LinkedList<Integer> path = new LinkedList();
        boolean[] visted = new boolean[nums.length];
        for(int i=0;i<visted.length;i++){
            visted[i] = false;
        }
        backtrack(nums,path,visted);
        return result;
    }

    private void backtrack(int[] nums , LinkedList<Integer> path,boolean[] visted){
        for(int i=0; i<nums.length; i++){
            if(path.size()==nums.length){
                result.add(new LinkedList<Integer>(path));
                return;
            }
            int value = nums[i];
            if(visted[i]==true){
                continue;
            }
            path.add(value);
            visted[i] = true;
            backtrack(nums,path,visted);
            visted[i] = false;
            path.removeLast();
        }
    }
}

关键一步是添加结果时,要重新创建list,result.add(new LinkedList(path));
不能直接result.add(path),因为path后面会有撤回操作,会被移除里面的元素,导致结果不对

你可能感兴趣的:(leetcode)