https://leetcode.com/problems/combination-sum/#/description
问题描述:
给定一个数组(没有重复元素),和一个目标值,找出这个数组的子集,是这个自己的元素和为这个目标值。
数组中的元素可以重复使用。
思路解析:
参考http://blog.csdn.net/u013275928/article/details/72230646
完全可以利用求子集的思路。
先排序,用dfs的方式,构造一个函数。
这里有一点需要注意:由于是dfs,调用函数,进入下一层,pos应该置为i,而不是i+1,因为元素可以重复使用,但是又新增了一个问题,由于指定了target目标值,templist中每个元素的和等于target才可以加入到result中,这里将target作为参数,递归的时候,减去当前的nums[i],用剩余的值作为参数传递过去,这种思想要掌握,但是如果,发现最后target-nums[i]的值不为0的时候,也就是说,这组值并不是符合条件的值,不应该加入到result中,遇到这种情况需要return,为什么?
因为每次将当前的位置作为参数传递下去,如果不满足条件,会一直调用下去,最后会栈溢出异常。
代码如下:
public class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
List<List<Integer>> result=new ArrayList<>();
getSubset(result,new ArrayList<>(),candidates,0,target);
return result;
}
public void getSubset(List<List<Integer>> result,List<Integer> temp,int[] nums,int pos,int target)
{
if(target<0)
{
return;
}
if(target==0)
{
result.add(new ArrayList<>(temp));
}
for(int i=pos;i<nums.length;i++)
{
// if(temp.contains(nums[i]))continue;
temp.add(nums[i]);
getSubset(result,temp,nums,i,target-nums[i]);
temp.remove(temp.size()-1);
}
}
}