BM56 有重复项数字的全排列
描述
给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。
数据范围: ,数组中的值满足
要求:空间复杂度 ,时间复杂度
示例1
输入:
[1,1,2]
复制返回值:
[[1,1,2],[1,2,1],[2,1,1]]
复制
示例2
输入:
[0,1]
复制返回值:
[[0,1],[1,0]]
题解
思路:
有重复数字的全排列和无重复数字的全排列唯一的区别就是需要进行去重,去重也很简单,只需要判断前一元素和当前元素是否相等。代码如下:
std::vector<std::vector<int>> perm_imp(std::vector<int> num)
{
std::vector<std::vector<int>> res;
if (num.size() == 0)
{
return res;
}
if (num.size() == 1)
{
res.push_back(num);
return res;
}
for (int i = 0; i < num.size(); ++i)
{
if (i > 0 && num[i] == num[i - 1])// 只加了这个逻辑~~
{
continue;
}
std::vector<int> cur = num;
cur.erase(cur.begin() + i);
auto cur_perm = perm_imp(cur);
for (auto &x : cur_perm)
{
x.push_back(num[i]);
res.push_back(x);
}
}
return res;
}
std::vector<std::vector<int>> permuteUnique(std::vector<int> &num)
{
std::sort(num.begin(), num.end());
auto ans = perm_imp(num);
std::sort(ans.begin(), ans.end(), [](std::vector<int> &a, std::vector<int> &b)
{
for (int i = 0; i < a.size();++i)
{
if (a[i] < b[i])
{
return true;
}
else if (a[i] > b[i])
{
return false;
}
}
return false; });
return ans;
}
int main()
{
std::vector<int> num{1, 2, 3};
permute(num);
return 0;
}