力扣hot100 组合总和 回溯 剪枝 组合

Problem: 39. 组合总和
在这里插入图片描述

思路

复杂度

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n)

💖 Code

class Solution{
	List<List<Integer>> res = new ArrayList<>();
	int x;// 全局target
	int[] c;// 全局 candidates

	public List<List<Integer>> combinationSum(int[] candidates, int target)
	{
		if (candidates == null || candidates.length == 0)
			return new ArrayList<>();
		x = target;
		c = candidates;
		dfs(0, 0, new ArrayList<Integer>());
		return res;
	}

	/**
	 * @param sum  当前已选数的和
	 * @param idx  当前选到的数的下标,下标 < idx 的数都不能选,防止重复
	 * @param list 当前已选数列表
	 */
	private void dfs(int sum, int idx, ArrayList<Integer> list)
	{
		if (sum >= x)// >= x 就返回
		{
			if (sum == x)// 只有 == x 时,才加入答案集合
				res.add(new ArrayList<>(list));
			return;
		}
		//从idx开始,idx前面的数选几个已经定了
		for (int i = idx; i < c.length; i++)
		{
			list.add(c[i]);
			dfs(sum + c[i], i, list);
			list.remove(list.size() - 1);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值