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


46. Permutations**_数组

通过和 ​​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;
}
};