- Permutations
Given a list of numbers, return all possible permutations.
Example
Example 1:
Input: [1]
Output:
[
[1]
]
Example 2:
Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
Challenge
Do it without recursion.
Notice
You can assume that there is no duplicate numbers in the list.
这题是排列类DFS的经典题。
注意与组合类DFS的区别。
- helper()不需要index参数。为什么呢?
在组合类DFS中,比如说我们求{1,3,2,4}的组合,我们要用index严格保证index=某数,比如说3了之后,不会再回头取。也就是说{1,3,2,4}和{3,2,1,4}是同一个solution。但是在排列类DFS中,是有可能回头取的,也就是说{1,3,2,4}和{3,2,1,4}是不同的solution。 - Permutations的helper()里面的for循环是从0开始,Subset的helper()里面的for循环是从index开始。
- 一定要加visited[],这样我们才能知道某个数是不是已经取了。
- 组合类Subsets需要排序,排列类Permutations不需要排序(但有重复元素的Permutations需要排序)!
class Solution {
public:
/*
* @param nums: A list of integers.
* @return: A list of permutations.
*/
vector<vector<int>> permute(vector<int> &nums) {
vector<vector<int>> results;
vector<int> sol;
vector<bool> visited(nums.size(), false);
if (nums.empty()) {
results.push_back(vector<int>());
return results;
}
helper(nums, visited, sol, results);
return results;
}
void helper(vector<int> &nums, vector<bool> &visited, vector<int> &sol, vector<vector<int>> &results) {
if (sol.size() == nums.size()) {
results.push_back(sol);
return;
}
for (int i = 0; i < nums.size(); ++i) {
if (visited[i]) continue;
visited[i] = true;
sol.push_back(nums[i]);
helper(nums, visited, sol, results);
visited[i] = false;
sol.pop_back();
}
}
};
另外,如果这题要用非递归的方式做呢?那就调用next_permutation()好了。
代码如下:
class Solution {
public:
/*
* @param nums: A list of integers.
* @return: A list of permutations.
*/
vector<vector<int>> permute(vector<int> &nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
res.push_back(nums);
while (next_permutation(nums.begin(), nums.end())) {
res.push_back(nums);
}
return res;
}
};
代码同步在
https://github.com/luqian2017/Algorithm