Leetcode 77组合

class Solution {
private:
	vector<vector<int>>res;
public:
	void DFS(int n, int k, int start, vector<int>& tem) {
		if (tem.size() == k) {
			res.push_back(tem);
			return;
		}
		//1这里面含有一步剪枝的操作,i再大,搜索是无意义的,此时搜不到这么长的。
		for (int i = start; i <= n - (k - tem.size()) + 1; i++) {
			tem.push_back(i);
			DFS(n, k, i + 1, tem);
			tem.pop_back();
		}
		return;
	}
	vector<vector<int>> combine(int n, int k) {
		res.clear();
		vector<int>tem;
		if (n <= 0 || k > n || k <= 0)
			return res;
		int start = 1;
		DFS(n, k, start, tem);
		return res;
		
	}
};

注意:对于代码处1的剪枝操作说明

 对于 n-(k-tem.size())+1;

其中代表最后一个数的大小,k代表每个组和包括的数字数量,tem代表目前已经组合好的

所以,(k-tem.size())代表组合还差x个元素,然后n-x+1代表从最后一个数向前推x个位置,如果i再继续往后取值,如上图所示,做的是无用功。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值