题目链接:https://leetcode-cn.com/problems/permutations/
题目描述
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路
核心的递归部分如下:
for begin in range(0,n):
for i in range(begin,n):
swap(nums[begin],nums[i]);
permuteCore(nums,begin+1)
swap(nums[begin],nums[i]);
不断交换首元素与后续元素的位置,直到到达最后一个元素时回溯。
复杂度分析
时间复杂度:O(n^2)
空间复杂度:O(1)
代码
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> ret;
if(nums.empty()) return ret;
permuteCore(nums,0,ret);
return ret;
}
// 回溯求解
void permuteCore(vector<int>& nums, int begin, vector<vector<int>>& ret){
if(begin >= nums.size()){ // 到达最后一元素 打印该排列
vector<int> res;
for (auto num:nums) {
res.push_back(num);
}
ret.push_back(res);
return;
}
for (int i = begin; i < nums.size(); ++i) {
swap(nums[begin],nums[i]); // 交换首元素和i位置元素
permuteCore(nums, begin+1, ret); // 递归到下一个元素
swap(nums[begin],nums[i]); // 恢复交换前位置
}
}
};