题目链接:https://leetcode.com/problems/combination-sum/
这是一个组合和的问题,备选数组里的数不重复,但是可以选择相同的数。肯定要用到回溯(backtrace)递归的方法。
我写递归时喜欢用一个静态list来存最终返回的答案,再开一个较大的静态数组来存临时答案。
下面考虑递归函数怎么写,被选数组和目标和肯定是一直要带的参数,需要一个idx变量来标记某次递归函数调用时在原数组中搜索的起点,这里因为可以重复选,因此起点可以在下一次递归函数调用时重复取到。还有因为存储在静态数组中的有效答案需要一个变量来记录,并随着数组向后搜索调用递归函数时自动增加。具体代码如下:
class Solution {
public static List<List<Integer>> ret;
public static int[] record=new int[100000];
public static List<List<Integer>> combinationSum(int[] candidates, int target)
{
ret=new LinkedList<>();
recursive(candidates,0,target,0);
return ret;
}
public static void recursive(int[] candidates,int idx,int target,int length)
{
if(target==0)
{
LinkedList<Integer> tmp=new LinkedList();
for(int i=0;i<length;i++)
tmp.add(record[i]);
ret.add(tmp);
return;
}
if(target<0 || idx>=candidates.length)
return;
for(int i=idx;i<candidates.length;i++)
{
record[length]=candidates[i];
recursive(candidates,i,target-candidates[i],length+1);
}
}
}