leetcode之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是沒有重複元素的情況,當時只需用map記錄當前元素是否用過然後深度遍歷即可,而在這道題中,因爲有重複元素,所以涉及去重問題,在前綴相同的情況下,不允許一個位置出現重複的元素(即僅出現一次即可),這與之前的從數列中尋找滿足給定和的序列的題目相似但不相同leetcode之Combination Sum && Combination Sum II,要注意區分去重的時機和方法,我對比看了下都有點兒暈了。。。

class Solution {
public:
     vector<vector<int> > permuteUnique(vector<int> &num) {
		sort(num.begin(),num.end());
        vector<vector<int>>vv;
		vector<int>v;
		map<int,int>mp;
		for(int i = 0; i < num.size(); i++){
			if(mp.find(num[i]) != mp.end())
			    mp[num[i]]++;
			else
				mp[num[i]] = 1;
		}
		permute(vv,v,num,mp);
		return vv;

    }
	void permute(vector<vector<int>>&vv,vector<int>v,vector<int>num,map<int,int>mp){
		if(v.size() == num.size()){
			vv.push_back(v);
			return ;
		}
		for(int i = 0; i < num.size(); i++){
			while(i > 0 && i < num.size() && num[i] == num[i - 1])
				i++;
			if(i == num.size()) //後邊的數全一樣,提前結束遍歷
				return;
			if(mp[num[i]] > 0)
			{
				mp[num[i]]--;
				v.push_back(num[i]);
				permute(vv,v,num,mp);
				v.pop_back();
			    mp[num[i]]++;
			}
		}
	}
};

因爲昨天下午做的求特定和的序列問題,今上午剛好又看了下沒有重複元素的情況下的全排列問題,所以這道題是自己碼出來的,但AC後對這道題理解的才更加透徹了些,在涉及重複元素問題時首先進行排序貌似是很有好處的。。。

發佈了85 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章