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]
.
思路:
如果是先排列,插入时检查是否重复会超时,所以必须递归排列的时候检查数字是否在之前出现过,如果出现了,就跳过去(注意每次检查的起始位置是 start, 不是从 0 开始的)。
class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int> > ivecArray;
if (num.size() == 0)
return ivecArray;
recursive(ivecArray, num, 0);
return ivecArray;
}
void recursive(vector<vector<int> > &ivecArray, vector<int> num, int start) {
int n = num.size();
if (start == n) {
ivecArray.push_back(num);
return;
}
for (int i = start; i < n; i++) {
int j = 0;
for (j = start; j < i; j++) { //注意 j 的取值范围
if (num[j] == num[i])
break;
}
if (j < i)
continue;
swap(num[i], num[start]);
recursive(ivecArray, num, start + 1);
swap(num[i], num[start]);
}
}
};