leetcode 47. Permutations II (生成全排列,有重复元素)

Given a collection of numbers that might contain duplicates, return all possible unique permutations.__

思路:和leet code 46 类似,最后用set去个重即可。。

1/* ***********************************************
2Author :111qqz
3Created Time :2017年04月13日 星期四 15时00分48秒
4File Name :47.cpp
5************************************************ */
6class Solution {
 1public:
 2    void solve( vector<int>&nums)
 3    {
 4	int n = nums.size();
 5	if (n==0) return;
 6	int k = -1;
 7	for ( int i = n-2 ; i >= 0 ; i--)
 8	{
 9	    if (nums[i]<nums[i+1])
10	    {
11		k = i;
12		break;
13	    }
14	}
15	if (k==-1)
16	{
17	    reverse(nums.begin(),nums.end());
18	    return;
19	}
20	int l = -1;
21	for ( int i = n-1 ; i >k ; i--)
22	{
23	    if (nums[k]<nums[i])
24	    {
25		l =  i;
26		break;
27	    }
28	}
29	swap(nums[l],nums[k]);
30	reverse(nums.begin()+k+1,nums.end());
31    }
 1    void pr (vector<int> &nums)
 2    {
 3	int siz = nums.size();
 4	for ( int i = 0 ; i < siz;  i++)
 5	    printf("%d%c",nums[i],i==siz-1?'\n':' ');
 6    }
 7    vector<vector<int>> permuteUnique(vector<int>& nums) {
 8	set<vector<int> >se;
 9	vector<vector<int> >res;
10	int n = nums.size();
11	int total = 1 ;
12	for ( int i = 2 ; i <= n ; i++) total*=i;
 1	for ( int i = 1 ; i <= total ; i++)
 2	{
 3	    se.insert(nums);
 4//	    pr(nums);
 5	    solve(nums);
 6	}
 7	for ( auto &it :se)
 8	{
 9	    res.push_back(it);
10	}
11	return res;
12    }
};