Combination Sum 和Combination Sum II

本文详细探讨了组合问题的解决策略,通过分治法实现了组合求和问题的复杂变体,阐述了如何将简单分支转换为循环,并对算法进行优化。包括排序、递归调用和去重等关键步骤的解释。

这两道题的基本思路和combination那一题是一致的,也是分治的方法。

其中combination Sum复杂一点,因为每个数可能用多次。仔细分析下,本质上也是一样的。原来是每个数仅两种可能。现在每个数有k +1中可能,k = target / i。

所以就是把简单的if else 分支变成for循环:

vector<vector<int> > combHelper(vector<int>::iterator first,
						vector<int>::iterator last, int target){
	vector<vector<int>> result;
	if (target <= 0 || last == first) return result;
	if (*(last - 1) == target){
		vector<int> vi;
		vi.push_back(target);
		result.push_back(vi);
		auto r2 = combHelper(first, last - 1, target);
		for (auto it = r2.begin(); it != r2.end(); it++)
			result.push_back(*it);
	}
	else if (*(last - 1) < target){
		auto r1 = combHelper(first, last - 1, target - *(last - 1));
		for (auto it = r1.begin(); it != r1.end(); it++){
			it->push_back(*(last - 1));
			result.push_back(*it);
		}
		auto r2 = combHelper(first, last - 1, target);
		for (auto it = r2.begin(); it != r2.end(); it++)
			result.push_back(*it);
	}
	else {
		auto r2 = combHelper(first, last - 1, target);
		for (auto it = r2.begin(); it != r2.end(); it++)
			result.push_back(*it);
	}
	return result;
}
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
	sort(num.begin(), num.end());
	auto result = combHelper(num.begin(), num.end(), target);
	if (!result.empty()){
		sort(result.begin(), result.end());
		auto it = unique(result.begin(), result.end());
		result.erase(it, result.end());
	}
	return result;
}

  

 

转载于:https://www.cnblogs.com/hustxujinkang/p/3967332.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值