class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
// Note: The Solution object is instantiated only once and is reused by each test case.
vector<vector<int> >ans;
sort(num.begin(),num.end());
do
ans.push_back(num);
while(nextPermute(num));
return ans;
}
bool nextPermute(vector<int> &num)
{//3、5、9、8、7、6、4
for(int i=num.size()-2;i>=0;i--)
{
if(num[i]<num[i+1])//从后往前找到第一个递增的相邻二元组,前面的将是替换点
{
for(int j=i+1;j<num.size();j++)
//j从i+1开始,找到第一个num[i]大于num[j+1]的地方,即说明num[j]>=num[i]>=num[j+1],
//然后将num[i]与num[j]对调的话,num[i+1]到num[size-1]还是满足递减的,
//因为对调num[i]、num[j]后,使num变大了,接下来就要找到num[i+1]到num[size-1]这串能表示的最小的数,
//因为它们已经递减了,再逆序它们即可
{
if(j==num.size()-1||num[j+1]<=num[i])
{
swap(num[i],num[j]);
reverse(num.begin()+i+1,num.end());
return true;
}
}
}
}
reverse(num.begin(),num.end());
return false;
}
};
【leetcode】Permutations II
最新推荐文章于 2021-02-02 11:47:10 发布