0
点赞
收藏
分享

微信扫一扫

[数组]BM56 有重复项数字的全排列-中等

​​BM56 有重复项数字的全排列​​

描述

给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。

数据范围: [数组]BM56 有重复项数字的全排列-中等_数据 ,数组中的值满足 [数组]BM56 有重复项数字的全排列-中等_全排列_02

要求:空间复杂度 [数组]BM56 有重复项数字的全排列-中等_数据_03,时间复杂度 [数组]BM56 有重复项数字的全排列-中等_数据_03

示例1

输入:

[1,1,2]

复制返回值:

[[1,1,2],[1,2,1],[2,1,1]]

复制

示例2

输入:

[0,1]

复制返回值:

[[0,1],[1,0]]

题解

思路:

有重复数字的全排列和无重复数字的全排列唯一的区别就是需要进行去重,去重也很简单,只需要判断前一元素和当前元素是否相等。代码如下:

#include <bits/stdc++.h>

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;
}
举报

相关推荐

全排列[中等]

0 条评论