首页 > 其他 > 详细

【leetcode】Permutations II

时间:2014-06-01 13:03:33      阅读:430      评论:0      收藏:0      [点我收藏+]

问题:

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].

说明:

这个问题建议看下侯捷的《STL源码剖析》,这本书里有很多有用的函数实现,讲解的也算清楚。这里就不啰嗦了。不同的是,这里给出的数是会存在重复的,需要预先进行下排序,其实即使不存在重复,因为给定的num参数也未必是有序的,也总是要排序后从最小的开始,知道找到了最大的,那么next permutation就全部找完了。

实现:

//code 1
 bool nextPermutetion(vector<int> &num)
{
	int i = num.size() - 1;
	while (i >= 1)
	{
		if(num[i] > num[i - 1])
		{
			--i;
			int ii = num.size() - 1;
			while (ii > i && num[ii] <= num[i]) --ii;
			if(ii > i)
			{
				swap(num[i], num[ii]);
				reverse(num.begin() + i + 1, num.end());

				return true;
			}

		}
		else
			--i;
	}
	if(i == 0)
		return false;
	return true;
}

vector<vector<int> > permuteUnique(vector<int> &num) {
	vector<vector<int> > re;
	if(num.size() == 0)
		return re;
	sort(num.begin(), num.end());
	re.push_back(num);
	while (nextPermutetion(num))
	{
		re.push_back(num);
	}
	return re;
}
//code 2
vector<vector<int> > permuteUnique(vector<int> &num) {
	vector<vector<int> > re;
	if(num.size() == 0)
		return re;
	sort(num.begin(), num.end());
	re.push_back(num);
	int i = num.size() - 1;
	
	while(1){
	    int ii = i;
	    --i;
	    if(i < 0)
	    return re;
		if(num[ii] > num[i])
		{
			ii = num.size() - 1;
			while (ii > i && num[ii] <= num[i]) --ii;
			if(ii > i)
			{
				swap(num[i], num[ii]);
				reverse(num.begin() + i + 1, num.end());
				re.push_back(num);
				i = num.size() - 1;
			}
		}
	}//end while 1
	return re;
}



【leetcode】Permutations II,布布扣,bubuko.com

【leetcode】Permutations II

原文:http://blog.csdn.net/shiquxinkong/article/details/27868007

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!