您的位置:首页 > 其它

LeetCode 46 Permutations

2016-06-01 15:44 567 查看
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]
.

方法一:逐渐生成前i个数的排列组合,然后把num[i+1]见缝插针,再组装成新的排列组合。见代码和打印结果。

public static List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<Integer>());
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);
list.add(j, nums[i]);
newRes.add(list);
}
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) {
result.add(new ArrayList<>(tempList));
} else {
for (int i = 0; i < nums.length; i++) {
if (tempList.contains(nums[i])) continue; // element already exists, skip
tempList.add(nums[i]);
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>();
for(int a:nums) list.add(a);
result.add(list);
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 wr