一、题目
Given a collection of 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]
, and [3,2,1]
.
二、分析
该题可以利用 LeetCode(31): Next Permutation 每次得到下一个排列来进行遍历,而该种方式,既可以使用自己写的next_permutation()函数,也可以偷懒利用 std::next_permutation(),偷懒做法如下, 时间复杂度为 O(n!):
vector<vector<int>> permute(vector<int>& nums){
vector<vector<int>> result;
sort(nums.begin(), nums.end());
do{
result.push_back(nums);
}while(next_permutation(nums.begin(), nums.end()));
return result;
}
另外一种方式,我们考虑,对于有 n - 1 个数的排列,在加入第 n 个数之前的排列方式为 (n - 1)! 种,加入第 n 个数时,我们采用插空法,即如下图为已经有 3 个数的其中一个排列为 1, 2, 3,则再增加一个数 4 后,该排列可以通过插空产生出 4 种不同的排列,对 3! 个排列均按如下方式插空,最终可以得到 4! 种排列。
三、代码
代码实现如下,时间复杂度也为 O(n!) :
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
if(nums.size() == 0) return result;
result.push_back(vector<int>(1, nums[0]));
for(size_t i = 1; i < nums.size(); ++i){
vector<vector<int>> tmp;
for(int j = 0; j <= i; ++j){
for(auto p : result){
p.insert(p.begin() + j, nums[i]);
tmp.push_back(p);
}
}
result = tmp;//std::move(tmp);
}
return result;
}