您的位置:首页 > 其它

LeetCode Permutations

2015-09-27 11:51 337 查看
原题链接在这里:https://leetcode.com/problems/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]
.

题解:

Combinations相似,都是NP问题可以采用递归加回朔,递归的终止条件与Combinations相同,item.size()满足要求就把item加到res里。

这里采用boolean [] used数组来代表当前数是否被用过。若是被用过就跳过,没有被用过把nums[i]加到item中,然后递归剩下的元素。

当递归结束后,减掉item尾部元素,同时需要维护used数组,把当前位置变回false, 确保进入递归和结束递归时状态相同。

Time Complexity: exponential.

AC Java:

public class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if(nums == null || nums.length == 0){
return res;
}
boolean [] used = new boolean[nums.length];
helper(nums,used,new ArrayList<Integer>(), res);
return res;
}
private void helper(int[] nums, boolean [] used, List<Integer> item, List<List<Integer>> res){
if(item.size() == nums.length){
res.add(new ArrayList<Integer>(item));
return;
}
for(int i = 0; i<nums.length; i++){
if(!used[i]){
used[i] = true;
item.add(nums[i]);
helper(nums,used,item,res);
item.remove(item.size()-1);
used[i] = false;
}
}
}
}


这道题的迭代方法如下:

Subsets相似,开始时item先加nums[0],然后把item加到res里,然后每次添加新的nums[i],首先把res里的每一个item拿出来,用cur表示。

在cur的所有可能位置加上新的元素nums[i], 然后把它加载回res里。

Note: res原有的item不能保留,所以每次扫描res所有item前新建newRes, 添加完新元素nums[i]的item是要加到newRes中去的,所有可能的item都加完后再把newRes赋值回res去。

Time Complexity: exponential.

AC Java:

public class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if(nums == null || nums.length == 0){
return res;
}
List<Integer> item = new ArrayList<Integer>();
item.add(nums[0]);
res.add(item);

for(int i = 1; i<nums.length; i++){
List<List<Integer>> newRes = new ArrayList<List<Integer>>();
for(int j = 0; j<res.size(); j++){
List<Integer> cur = res.get(j);
for(int k = 0; k<=cur.size(); k++){
// 记得这里要做个copy, 不能直接在原来的cur上加
item = new ArrayList<Integer>(cur);
item.add(k, nums[i]);
newRes.add(item);
}
}
res = newRes;
}
return res;
}
}


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