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]
.
由于元素不能重复,所以要用一个visited数组记录哪些已经被访问过。
Source
public class Solution {
public List<List<Integer>> permute(int[] num) {
List<List<Integer>> st = new ArrayList<List<Integer>>();
List<Integer> a = new ArrayList<Integer>();
if(num.length == 0) return st;
boolean[] visited = new boolean[num.length];
searchNum(num, st, a, visited);
return st;
}
public void searchNum(int[] num, List<List<Integer>> st, List<Integer> a, boolean[] visited){
if(a.size() == num.length){
st.add(new ArrayList<Integer>(a)); //注意递归时的st添加要为a新分配空间
return;
}
for(int i = 0; i < num.length; i++){
if(!visited[i]){
a.add(num[i]);
visited[i] = true;
searchNum(num, st, a, visited);
a.remove(a.size() - 1); //remove***
visited[i] = false;
}
}
}
}
Test
public static void main(String[] args){
int[] num = {1,2,3};
System.out.println(new Solution().permute(num));
}