题目描述
输入一组数字(可能包含重复数字),输出其所有的排列方式。
样例
输入:[1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
算法1
又是抄y总作业的一天
在y总没有重复数字那道题上,加了对重复数字的判断,确保不会重复计算
C++ 代码
class Solution {
public:
vector<vector<int>> permutation(vector<int>& nums) {
if(nums.empty()) return res;
st.resize(nums.size(), false);
dfs(nums);
return res;
}
void dfs(vector<int>& nums)
{
for(int i = 0; i < nums.size(); ++i)
{
if(!st[i])
{
if(i == 0 || nums[i-1] != nums[i] || st[i-1]) //加了一个关于重复数字的判断
{
tmp.push_back(nums[i]);
st[i] = true;
dfs(nums);
tmp.pop_back();
st[i] = false;
}
}
}
if(tmp.size() == nums.size())
res.push_back(tmp);
}
vector<int> tmp;
vector<bool> st;
vector<vector<int>> res;
};