题解 | #有重复项数字的全排列#
有重复项数字的全排列
https://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863
#include <algorithm>
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型vector
* @return int整型vector<vector<>>
*/
static bool compare_int(int a, int b){
return a<b;
}
static bool compare_vectorint(vector<int>a , vector<int>b){
bool flag=true;
for (int i=0; i<a.size(); i++) {
if (a[i]!=b[i]) {
a[i]<b[i]?flag=true:flag=false;
break;
}
}
return flag;
}
vector<vector<int>>result;
vector<int>path;
vector<vector<int>> permuteUnique(vector<int>& num) {
// write code here
if (num.size()==0||num.size()==1) {
result.push_back(num);
return result;
}
sort(num.begin(), num.end(),compare_int);
vector<int>used(num.size(),0);
BackTracking(num, used);
sort(result.begin(), result.end(), compare_vectorint);
return result;
}
void BackTracking(vector<int>& num, vector<int>& used){
if (path.size()==num.size()) {
result.push_back(path);
return;
}
for (int i=0; i<num.size(); i++) {
//横向树层剪枝
if (i>0&&num[i]==num[i-1]&&used[i-1]==0) {
continue;
}
//防止反复取某一个数
else if (used[i]==1) {
continue;
}
else {
path.push_back(num[i]);
used[i]=1;
BackTracking(num, used);
path.pop_back();
used[i]=0;
}
}
}
};
