题目要求和上一题类似,不过给出的整数可能有重复,输出不能含有相同的排列。
参考第31题,Next Permutation。需要注意的是把循环里的一些大于号改成大于等于,这样就不会产生重复的排列。
代码:
bool getNext(vector<int>& order) {
int j, k;
k = order.size() - 1;
while(k > 0 && order[k - 1] >= order[k]) k--; //注意大于等于
if(k == 0) {
j = 0;
k = order.size() - 1;
while(j < k) {
swap(order[j], order[k]);
j++;
k--;
}
return true;
}
j = k - 1;
k = order.size() - 1;
while(j < k && order[j] >= order[k]) k--; //注意大于等于
swap(order[j], order[k]);
j++;
k = order.size() - 1;
while(j < k) {
swap(order[j], order[k]);
j++;
k--;
}
return true;
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> result;
vector<int> origin(nums);
do{
result.push_back(nums);
getNext(nums);
}while(nums != origin);
return result;
}