题目描述(Medium)
Given a collection of distinct integers, return all possible permutations.
题目链接
https://leetcode.com/problems/permutations/description/
Example 1:
Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
算法分析
方法一:dfs解法,每次从左到右,选一个没有出现过的元素,当走到最后一个元素时则返回。时间复杂度,空间复杂度。
方法二:自己实现next_permutation(),详见【LeetCode】12.Next Permutation,时间复杂度,空间复杂度。
提交代码(方法一):
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
vector<int> path;
dfs(nums, path, result);
return result;
}
void dfs(vector<int>& nums, vector<int>& path,
vector<vector<int>>& result) {
if (path.size() == nums.size())
{
result.push_back(path);
return;
}
for (auto i : nums)
{
auto pos = find(path.begin(), path.end(), i);
if (pos == path.end())
{
path.push_back(i);
dfs(nums, path, result);
path.pop_back();
}
}
}
};
提交代码(方法二):
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(), nums.end());
do
{
result.push_back(nums);
} while(next_permutations(nums));
return result;
}
bool next_permutations(vector<int>& nums)
{
auto rfirst = nums.rbegin();
auto rlast = nums.rend();
auto pivot = rfirst + 1;
while (pivot != rlast && *pivot > *(pivot - 1))
++pivot;
if (pivot == rlast)
return false;
auto onchange = find_if(rfirst, pivot, bind1st(less<int>(), *pivot));
swap(*pivot, *onchange);
reverse(rfirst, pivot);
return true;
}
};