LeetCode40——Combination Sum II

LeetCode40——Combination Sum II

与上一题Combination Sum类似,只不过是有放回的取。

这题最关键的就是去重。所谓去重,不是删除序列中重复的元素,而是当序列中出现相同的数时,会递归产生相同的结果。

例如:序列排序后为

1 1 2 3 4

假如target为3,不去重的话就会产生两个[1,2],分别由索引为0和索引为1的1和2组合产生。


在代码中提出了先获取result再对result进行去重的操作,这种办法是超时的。

去重操作在深度搜索中就进行:

定义当前搜索的开始索引,如果当前深度的值(nums[i])与上一深度的值(nums[i-1])相等则continue;

当然还得满足一个大前提,当前深度非起始深度,这样就保证了如下情况的结果:

例如:序列排序后是为

1 1 2 3 4

target为5

则结果集中会有[1,1,3]


代码:

class Solution {
private:
	void myFun(int sum,int target,int start,vector<vector<int>>&result,vector<int>temp,vector<int>candidates)
	{
		if (sum == target)
		{
			result.push_back(temp);
			return;
		}
		if (sum > target)
			return;
		for (int i = start;i<candidates.size();i++)
		{
			if (i!=start&&candidates[i] == candidates[i - 1])//去重
					continue;
			temp.push_back(candidates[i]);
			myFun(sum + candidates[i], target,i+1 ,result,temp,candidates );
			temp.pop_back();
		}
	}
public:
	vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
		sort(candidates.begin(), candidates.end());
		//candidates.erase(unique(candidates.begin(),candidates.end()),candidates.end());
		vector<vector<int>>result;
		vector<int>temp;
		myFun(0, target, 0, result, temp, candidates);
		//超时
		//sort(result.begin(),result.end());
		//result.erase(unique(result.begin(),result.end()),result.end());
		return result;
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值