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]
]
Solution:
以前程设课也做过类似的题目,简单递归,每次选一个未被使用的元素加进数组,当数组元素数量足够时就加进解里。
总觉得这个题可以用动态规划,因为有大量重复的子问题,比如已经确定好当前数组的前i个元素是原数组的前i个元素,这样的组合就有不少,那么原数组剩下的i+1到n这些元素就有不同的组合接在上面的当前数组中,而这样的“当前数组“也有前i个元素的组合数那么多种可能,对于每一种可能都要递归求解相同的子问题。但是一时没想到怎么存起来这些子问题。
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<bool> visited(nums.size(), false);
vector<vector<int>> ret;
vector<int> tmp;
dfs(nums, tmp, visited, ret);
return ret;
}
void dfs(vector<int>& nums, vector<int>& tmp, vector<bool> visited, vector<vector<int>>& ret) {
if (nums.size() == tmp.size()) {
ret.push_back(tmp);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (visited[i])
continue;
tmp.push_back(nums[i]);
visited[i] = true;
dfs(nums, tmp, visited, ret);
visited[i] = false;
tmp.pop_back();
}
}
};