Rockwall

导航

LeetCode 【47. 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],
  [2,1,1]
]

思路1.
这题与Permutations的区别在于他允许重复数字,最简单的就是利用1的结果,保存在一个set中,去重复后保存结果,但不够理想。

思路2.

对数组先进行排序,如果有重复数字,则跳过,需要注意的是,因为排序,如果采用引用传递,则会破坏排序,所以使用值传递。当然也可以使用引用传递,但每次传递后,把交换的数据交换回来并且对后序数组再进行排序。
class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>> result;
	    sort(nums.begin(),nums.end());
	    permuteRec( 0, nums, result);
	    return result;
    }

private:
    void permuteRec( int start, vector<int> nums, vector<vector<int>> &result ){
		if( start >= nums.size()){
			result.push_back(nums);
			return;
		}
		for( int i = start; i < nums.size(); i++ ){
            if( i > start && nums[i] == nums[start]) continue;
            swap( nums[start], nums[i] );
			permuteRec( start+1, nums, result);
		}
    }
};

  

posted on 2016-08-11 19:37  Rockwall  阅读(713)  评论(0编辑  收藏  举报