您的位置:首页 > 其它

[ LintCode] Permutations

2015-10-28 23:12 295 查看

Permutations

Given a list of numbers, return all possible permutations.

Example

For nums =
[1,2,3]
, the permutations are:

[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]


Challenge

Do it without recursion.

SOLUTION 1:

递归

permutations的题,跟subsets基本上是差不多的,只是在往result里加list时候,并不是加入子集而是加入全排列,所以要加入一些条件,list size等于nums的size才可以加入。

class Solution {
/**
* @param nums: A list of integers.
* @return: A list of permutations.
*/
public ArrayList<ArrayList<Integer>> permute(ArrayList<Integer> nums) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if (nums == null || nums.size() == 0){
return result;
}
ArrayList<Integer> list = new ArrayList<Integer>();
helper(result, list, nums);
return result;
}
private void helper(ArrayList<ArrayList<Integer>> result, ArrayList<Integer> list, ArrayList<Integer> nums){
if (list.size() == nums.size()){
result.add(new ArrayList<Integer>(list));
return;
}
for (int i = 0; i < nums.size(); i++){
if (list.contains(nums.get(i))){
continue;
}
list.add(nums.get(i));
helper(result, list, nums);
list.remove(list.size() - 1);
}
}
}


View Code

SOLUTION 2:

非递归

非递归,用的九章的答案,基本思路,用stack模拟DFS过程。背诵吧就。

class Solution {
/**
* @param nums: A list of integers.
* @return: A list of permutations.
*/
public ArrayList<ArrayList<Integer>> permute(ArrayList<Integer> nums) {
ArrayList<ArrayList<Integer>> permutations
= new ArrayList<ArrayList<Integer>>();
if (nums == null || nums.size() == 0) {
return permutations;
}

int n = nums.size();
ArrayList<Integer> stack = new ArrayList<Integer>();

stack.add(-1);
while (stack.size() != 0) {
Integer last = stack.get(stack.size() - 1);
stack.remove(stack.size() - 1);

// increase the last number
int next = -1;
for (int i = last + 1; i < n; i++) {
if (!stack.contains(i)) {
next = i;
break;
}
}
if (next == -1) {
continue;
}

// generate the next permutation
stack.add(next);
for (int i = 0; i < n; i++) {
if (!stack.contains(i)) {
stack.add(i);
}
}

// copy to permutations set
ArrayList<Integer> permutation = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
permutation.add(nums.get(stack.get(i)));
}
permutations.add(permutation);
}

return permutations;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: