Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]
have the following unique permutations:
[1,1,2]
, [1,2,1]
,
and [2,1,1]
.
相对于上面的题目,要cut到一些subtree,所以在swap 的时候要判断一下在k和i中间是不是已经存在当前i的值,如果存在就不继续了。
class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
vector<vector<int> > res;
permute(num, 0, num.size() - 1, res);
return res;
}
bool noswap(int k, int i, const vector<int> num){
for (int j=k;j<i;j++){
if (num[j]==num[i]){
return true;
}
}
return false;
}
void permute(vector<int> &input, int k, int n, vector<vector<int> > &res) {
if (k == n) {
res.push_back(input);
} else {
for (int i = k; i <= n; i++) {
if (noswap(k,i,input))
continue;
int tmp = input[i];
input[i] = input[k];
input[k] = tmp;
permute(input, k + 1, n, res);
input[k] = input[i];
input[i] = tmp;
}
}
}
};