Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
绝对是经典题啊
还记得当初在cts的办公室里刷这道题的时候,把解法打印出来每天看一遍都不是很能理解,现在终于可以自己刷出来了,还是蛮感动的。
class Solution {
public List<List<Integer>> permute(int[] nums) {
int[] visited = new int[nums.length];
Arrays.fill(visited, 0);
List<List<Integer>> res = new ArrayList<>();
permuteHelper(nums, visited, new ArrayList<>(), res);
return res;
}
private void permuteHelper(int[] nums, int[] visited, List<Integer> curr, List<List<Integer>> res){
if (curr.size() == nums.length){
res.add(new ArrayList<Integer>(curr));
return;
}
for(int i = 0; i < visited.length; i++){
if (visited[i] == 0){
visited[i] = 1;
curr.add(nums[i]);
permuteHelper(nums, visited, curr, res);
visited[i] = 0;
curr.remove(curr.size() - 1);
}
}
return;
}
}
解题关键依然是:
感觉可以算作是DFS吧
1. 搞一个helper函数, 这样可以recursive的调用
2. 需要一个visited 的东西来记录节点是不是已经访问过。
3. 在访问过之后,要重新设置回来、
4. 设置好一个结束条件,这样可以return
在这道题里面,一开始犯了一个错误,就是res.add(visited). 然而我们加进来的是visited的指针,并不是数组本身。