题目
Given a collection of 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]
.
1 基础的基础again,深度遍历的应用的,递归写法;
2 一开始的写法是如下的:
public class Solution {
public ArrayList<ArrayList<Integer>> permute(int[] num) {
ArrayList<ArrayList<Integer>> ans = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> temp = new ArrayList<Integer>();
int n = num.length;
if(n==0){
return ans;
}
useme(ans,temp,num,n);
return ans;
}
public void useme(ArrayList<ArrayList<Integer>> ans, ArrayList<Integer> temp,int [] num,int n){
if(temp.size()==n){
ans.add(new ArrayList<Integer>(temp));
return ;
}
for(int i=0;i<n;i++){
if(!temp.contains(num[i])){
temp.add(num[i]);
useme(ans,temp,num,n);
temp.remove(temp.size()-1);
}
}
}
}
3上面有个问题,就是temp.contains(num[i])这个函数其实是很费时间的,要把list当中都遍历一遍才知道,所以才考虑新的写法
4 把数组的内容导入到一个新的arraylist中去,这样每次增加删除都可以具体指定,不需要遍历检查是否出现过,时间大大减少了。
public class Solution {
public ArrayList<ArrayList<Integer>> permute(int[] num) {
ArrayList<ArrayList<Integer>> ans = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> done = new ArrayList<Integer>();
int n = num.length;
if(n==0){
return ans;
}
ArrayList<Integer> former = new ArrayList<Integer>();
for(int i=0;i<n;i++){
former.add(num[i]);
}
useme(ans,done,former);
return ans;
}
public void useme(ArrayList<ArrayList<Integer>> ans, ArrayList<Integer> done, ArrayList<Integer> former){
if(former.size()==0){
ans.add(new ArrayList<Integer>(done));
return ;
}
for(int i=0;i<former.size();i++){
int temp = former.remove(i);
done.add(temp);
useme(ans,done,former);
done.remove(done.size()-1);
former.add(i,temp);
}
}
}