您的位置:首页 > 其它

[LeetCode]Permutations

2016-10-18 16:21 260 查看
Question

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],

[3,2,1]

]

本题难度Medium。

【复杂度】

时间 O(N!) 空间 O(N)

【思路】

就是用树的方法进行遍历。算法为DFS。

【注意】

1、本题说没有重复的数字(如果有就要进行检查)

2、在写递归程序时候要注意递归返回后有没有引起side effect。如果我不写代码30-31行,就会引起错误。代码26-31行相当于用了一个循环队列来进行各项遍历,遍历完了就恢复到初始状态,所以不会引起side effect。当然也可以这样写:

for(int i=0;i<remains.size();i++){
int n=remains.get(i); //be careful
remains.remove(i);
preList.add(n);
helper(preList,remains,ans);
preList.remove(preList.size()-1);
remains.insert(i,n);
}


不过报错:
cannot find symbol: method insert(int,int)
。可能方法名搞错了吧。

【代码】

public class Solution {
public List<List<Integer>> permute(int[] nums) {
//require
List<List<Integer>> ans=new ArrayList<>();
if(nums==null)
return ans;
int size=nums.length;
if(size==0)
return ans;
List<Integer> remains=new ArrayList<Integer>(),list=new ArrayList<Integer>();
for(int n:nums)
remains.add(n);
//invariant
helper(list,remains,ans);
//ensure
return ans;
}
private void helper(List<Integer> preList,List<Integer> remains,List<List<Integer>> ans){
//bound
if(remains.size()==0){
List<Integer> list=new ArrayList<Integer>(preList);
ans.add(list);
return;
}
for(int i=0;i<remains.size();i++){
int n=remains.get(0);//be careful
remains.remove(0);
preList.add(n);
helper(preList,remains,ans);
preList.remove(preList.size()-1);
remains.add(n);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode