# LeetCode 46 Permutations

Given a collection of distinct numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:

[1,2,3][1,3,2][2,1,3][2,3,1][3,1,2], and [3,2,1].

	public static List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
List<List<Integer>> newRes = new ArrayList<>();
for (int j = 0; j <= i; j++)
for (List<Integer> k : result) {
List<Integer> list = new ArrayList<>(k);
}
result = newRes;
System.out.println("tmp result = "+result);
}
return result;
}

System.out.println("tmp result = "+result);
nums = [0, 1, 2, 3]的打印结果：

tmp result = [[0]]
tmp result = [[1, 0], [0, 1]]
tmp result = [[2, 1, 0], [2, 0, 1], [1, 2, 0], [0, 2, 1], [1, 0, 2], [0, 1, 2]]
tmp result = [[3, 2, 1, 0], [3, 2, 0, 1], [3, 1, 2, 0], [3, 0, 2, 1], [3, 1, 0, 2], [3, 0, 1, 2], [2, 3, 1, 0], [2, 3, 0, 1], [1, 3, 2, 0], [0, 3, 2, 1], [1, 3, 0, 2], [0, 3, 1, 2], [2, 1, 3, 0], [2, 0, 3, 1], [1, 2, 3, 0], [0, 2, 3, 1], [1, 0, 3, 2], [0, 1, 3, 2], [2, 1, 0, 3], [2, 0, 1, 3], [1, 2, 0, 3], [0, 2, 1, 3], [1, 0, 2, 3], [0, 1, 2, 3]]

It could be solved using modified DFS.  Each time insert one element that has not been inserted yet.

The idea it so start with empty set. Each time , one number is introduced, for each existing solution, insert this number to all possible positions.

	public static List<List<Integer>> permute2(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
backtrack(result, new ArrayList<Integer>(), nums);
return result;
}

private static void backtrack(List<List<Integer>> result, List<Integer> tempList, int[] nums) {
if (tempList.size() == nums.length) {
} else {
for (int i = 0; i < nums.length; i++) {
if (tempList.contains(nums[i])) continue; // element already exists, skip
backtrack(result, tempList, nums);
tempList.remove(tempList.size() - 1);
}
}
}


	public List<List<Integer>> permute3(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
perm(result, nums, 0);
return result;
}

public void perm(List<List<Integer>> result, int[] nums, int pos) {
if(pos == nums.length) {
List<Integer> list = new ArrayList<Integer>();
return;
}
for(int i=pos; i<nums.length; i++) {
swap(nums, i, pos);
perm(result, nums, pos+1);
swap(nums, i, pos);
}
}

private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}


• 本文已收录于以下专栏：

举报原因： 您举报文章：LeetCode 46 Permutations 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)