Permutations II
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]
.
首先分析一下与Permutations有何差异。
记当前位置为start,当前排列数组为cur
1、cur[start]与cur[start]值相同的元素交换位置会产生大量重复。
如:1,3,2,1
两个1互换位置之后,后续的所有排列都是重复的。
2、cur[start]与其他相同值的元素多次交换位置会产生大量重复。
如:1,2,3,2
1与两个2互换位置后,后续的所有排列都是重复的。
因此改变在于:
对于同一个值,只交换一次,否则跳过。
为了保证这一点,必须对cur数组start位置之后的元素排序,这样可以用while循环跳过已经交换过的元素。
若不排序会产生如下问题:
0,0,1,9 --> 9,0,1,0
0就不连续了,又会产生重复。
class Solution { public: vector<vector<int> > permuteUnique(vector<int> &num) { vector<vector<int> > result; vector<int> cur = num; Helper(result, cur, 0); return result; } void Helper(vector<vector<int> >& result, vector<int> cur, int start) { sort(cur.begin()+start, cur.end()); //must! if(start == cur.size()-1) { result.push_back(cur); } else { Helper(result, cur, start+1); int last = cur[start]; int i = start+1; while(true) { while(i < cur.size() && cur[i] == last) i ++; if(i < cur.size()) { swap(cur[start], cur[i]); Helper(result, cur, start+1); swap(cur[i], cur[start]); last = cur[i]; } else break; } } } };
时间: 2024-10-21 19:11:34