时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
class Solution{
List> res = new ArrayList<>();
int x;// 全局target
int[] c;// 全局 candidates
public List> combinationSum(int[] candidates, int target)
{
if (candidates == null || candidates.length == 0)
return new ArrayList<>();
x = target;
c = candidates;
dfs(0, 0, new ArrayList());
return res;
}
/**
* @param sum 当前已选数的和
* @param idx 当前选到的数的下标,下标 < idx 的数都不能选,防止重复
* @param list 当前已选数列表
*/
private void dfs(int sum, int idx, ArrayList 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);
}
}
}