47. 全排列 II

47. 全排列 II,第1张

47. 全排列 II

把所有的数全部统计出来,根据index,每次从其中拿出一个,++index。自然用的都是递归。不要再像全排列I似的swap。官方题解写的很清楚了。为了避免重复,每次在for中添加数字的时候不让添加重复的数字,因此传入的是哈希表。

#include
#include
#include
#include
using namespace std;
vector >ret;
int n;
void recursion(vectora, unordered_mapnotused, int index)
{
	if(index >= n)
		ret.push_back(a);
	for(auto notindex : notused)
	{
		auto newnotused = notused;
		if(1==notindex.second)
			newnotused.erase(notindex.first);
		else
			--newnotused.find(notindex.first)->second;

		auto b = a;
		b.push_back(notindex.first);
		recursion(b, newnotused, index+1);
	}
	return;
}

vector> permuteUnique(vector& nums) {
	n = (int)nums.size();
	unordered_mapnotused;
	for(int i=0; i<(int)nums.size(); ++i)
	{
		auto it_notused = notused.find(nums[i]);
		if(it_notused == notused.end())
			notused.insert(pair(nums[i], 1));
		else
			++it_notused->second;
	}
	vectora;
	recursion(a, notused, 0);
	return ret;
}

int main(void)
{
	vectora={2,2,1,1};
	permuteUnique(a);
	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5659073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存