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]
]
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > ret(1, vector<int>(1, nums[0]));
size_t size = nums.size();
for (size_t i = 1; i < size; ++i) {
size_t lastSize = ret.size();
int val = nums[i];
for (size_t j = 0; j < lastSize; ++j) {
for (size_t k = 0; k < ret[j].size(); ++k) {
vector<int> tmp(ret[j]);
tmp.insert(tmp.begin() + k, val);
ret.push_back(tmp);
}
ret[j].push_back(val);
}
}
return ret;
}
};
参考后
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > ret;
vector<int> ans;
recurve(nums, ret, ans);
return ret;
}
private:
void recurve(vector<int>& nums, vector<vector<int> >& ret, vector<int>& ans) {
size_t size = nums.size();
if (ans.size() == size) {
ret.push_back(ans);
return;
}
for (size_t i = 0; i < size; ++i) {
int val = nums[i];
if (find(ans.begin(), ans.end(), val) == ans.end()){
ans.push_back(val);
recurve(nums,ret, ans);
ans.pop_back();
}
}
return;
}
};
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > ret;
recurve(nums, 0, ret);
return ret;
}
private:
void recurve(vector<int>& nums, size_t pos, vector<vector<int> >& ret) {
if (pos == nums.size() - 1) {
ret.push_back(nums);
return;
}
for (size_t i = pos; i < nums.size(); ++i) {
swap(nums[pos], nums[i]);
recurve(nums, pos + 1, ret);
swap(nums[pos], nums[i]);
}
return;
}
};