46. 全排列
来源: LeetCode 46. 全排列
题目描述
46. 全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路分析
回溯算法解决
全排列需要对部分数据进行剪枝
不能用到已经用到的重复数据
利用hash表,如果打算加入的数据已经在当前路径中跳过
代码
class Solution {
public:
vector<vector<int>> res;
vector<int> _nums;
unordered_set<int> myset;
vector<vector<int>> permute(vector<int>& nums) {
_nums = nums;
unordered_set<int>myset;
vector<int> temp;
permuteRecur(temp, myset);
return res;
}
void permuteRecur(vector<int> &arry, unordered_set<int>& myset){
if(arry.size() == _nums.size()){
res.push_back(arry);
}
else{
for(int i=0; i<_nums.size(); ++i){
if(myset.find(_nums[i]) == myset.end()){
myset.insert(_nums[i]);
arry.push_back(_nums[i]);
permuteRecur(arry, myset);
arry.pop_back();
myset.erase(myset.find(_nums[i]));
}
}
}
}
};
算法分析
时空均为O(N!)
代码改进
这里用hash表的空间降低了查找vector的时间复杂度
相似扩展
归纳总结
排列类的基本问题,无重复元素不需要考虑如何去除重复元素,只需要确保使用未使用过的数据
基于该题扩展其他题目