题目大意:给出一个包含重复元素的数组,找出该数组所有可能的唯一排列。
算法思想:字典序法。
1.对数组排序,将初始序列放入结果中。
2.找出p=max{i|a[i]<a[i+1]}
3.找出q=max{j|a[j]>a[p]}
4.swap(a[p],a[q])
5.将a[p+1]之后的元素倒序。
6将生成的结果保存起来。
7.重复2~6.
代码如下:
class Solution {
public:
vector<vector<int> > permuteUnique(vector<int>& nums) {
vector<vector<int> > res;
if (nums.size() == 0) return res;
sort(nums.begin(),nums.end());
res.push_back(nums);
while (1){
int p = -1, q = -1;
for(int i=nums.size()-2;i>=0;--i){
if (nums[i] < nums[i + 1])
{
p = i;
break;
}
}
if (p != -1){
for (int j = nums.size() - 1; j>p; --j){
if (nums[j] > nums[p]){
q = j;
break;
}
}
swap(nums[p], nums[q]);
int start = p + 1, end = nums.size() - 1;
while (start < end){
swap(nums[start], nums[end]);
++start;
--end;
}
res.push_back(nums);
}
else
break;
}
return res;
}
};