首页 > 代码库 > 【LeetCode】Permutations II
【LeetCode】Permutations II
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; } } }};
【LeetCode】Permutations II
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。