leetcode_38_39_combiantionsum_1+2

传送门:

https://leetcode.com/problems/combination-sum/

https://leetcode.com/problems/combination-sum-ii/

思路:

用的是DFS递归搜索,如果有满足条件,则加入集合,否则弹出。

pop_back()函数一开始写错了。

STL这里太容易混淆了。


第一题AC代码:

class Solution{
public:

	void solve(int cur,int n,vector<int>& res,vector<vector<int> >& ans,int target,int sum,vector<int>& candidates)
	{
		if(sum==target)
		{
			ans.push_back(res);
			return;
		}

		for(int i=cur;i<n;i++)
		{
			if(sum+candidates[i]<=target)
			{
				res.push_back(candidates[i]);
				solve(i,n,res,ans,target,sum+candidates[i],candidates);
				res.pop_back();
			}
		}
	}
	vector<vector<int> > combinationSum(vector<int>&candidates,int target)
	{
		vector<vector<int> > ans;
		vector<int> res;
		sort(candidates.begin(),candidates.end());
		solve(0,candidates.size(),res,ans,target,0,candidates);
		return ans;
	}
};

第二题思路是一样的:

考虑集合不能相等,所以多加了一个判定函数;同时判别式应该从下一位开始。

class Solution {
public:
    bool check(vector<int>& res,vector<vector<int> >&ans)
    {
        for(int i=0;i<ans.size();i++)
            if(res==ans[i]) return false;
        return true;
    }
	void solve(int cur,int sum,int target,vector<int>& res,vector<int>& num,vector<vector<int> >& ans)
	{
		if(sum==target && check(res,ans))
		{
			ans.push_back(res);
			return;
		}

		for(int i=cur;i<num.size();i++)
		{
			if(sum+num[i]<=target)
			{
				res.push_back(num[i]);
				solve(i+1,sum+num[i],target,res,num,ans);
				res.pop_back();
			}
		}
	}
    vector<vector<int> > combinationSum2(vector<int> &num, int target) {
    	vector<int> res;
    	vector<vector<int> > ans;
    	sort(num.begin(),num.end());
    	solve(0,0,target,res,num,ans);
    	return ans;
        
    }
};


但有意思的是这里的情况:

http://www.hrwhisper.me/archives/523,@hrwhisper 写的代码同样AC,具体思路是一样的,但他的判定条件和我的完全不同,并且我也看不懂他的代码

(换言之,按照那种思路的话[1,1,6]就不会出现在判例中)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值