46. Permutations**
原创
©著作权归作者所有:来自51CTO博客作者珍妮的选择的原创作品,请联系作者获取转载授权,否则将追究法律责任
46. Permutations**
https://leetcode.com/problems/permutations/
题目描述
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]
]
C++ 实现 1
通过和 nums[start ... N - 1]
这个子序列中的首位进行 swap
, 可以依次访问数组中的每一个值.
class Solution {
private:
void dfs(vector<int> &nums, int start, vector<int> &cur, vector<vector<int>> &res) {
if (cur.size() == nums.size()) {
res.push_back(cur);
return;
}
for (int i = start; i < nums.size(); ++ i) {
std::swap(nums[i], nums[start]);
cur.push_back(nums[start]);
dfs(nums, start + 1, cur, res);
std::swap(nums[i], nums[start]);
cur.pop_back();
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> cur;
dfs(nums, 0, cur, res);
return res;
}
};
C++ 实现 2
在 C++ 实现 1
中发现 cur
其实可以不需要, 用 nums
自身进行 swap
也是可行的.
class Solution {
private:
void dfs(vector<int> &nums, int start, vector<vector<int>> &res) {
if (start == nums.size()) {
res.push_back(nums);
return;
}
// 第二个 swap 相当于回溯
for (int i = start; i < nums.size(); ++ i) {
std::swap(nums[i], nums[start]);
dfs(nums, start + 1, res);
std::swap(nums[i], nums[start]);
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
dfs(nums, 0, res);
return res;
}
};
C++ 实现 3
另一种做法, 写出这种解法是为了求解 47 题 Permutations II 方便. 注意到, dfs
中的 nums
是拷贝而不是使用引用, 另外, dfs
后面的 swap
去掉了.
class Solution {
private:
void dfs(vector<vector<int>> &res, vector<int> nums, int begin) {
if (begin == nums.size()) {
res.push_back(nums);
return;
}
for (int i = begin; i < nums.size(); ++i) {
std::swap(nums[i], nums[begin]);
dfs(res, nums, begin + 1);
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
dfs(res, nums, 0);
return res;
}
};