39. Combination Sum 40. Combination Sum II 216. Combination Sum III

来源:互联网 发布:加强网络舆情监管 编辑:程序博客网 时间:2024/06/05 10:55

模仿dsf算法

使用深度优先的方法搜索,并且用一个list记录向量,找到合适的向量时即将它保存在结果中,并进行回溯操作。对于输入candidates=[1,2] ,target=3,遍历的方向如图


通用算法思路总结:

  1. 初始结果列表。

  2. 可能要将数集排序,方便处理重复元素的情况。

  3. 调用递归函数。

  4. 书写递归函数,先要考虑原点状况,一般就是考虑什么情况下要将当前结果添加到结果列表中。

  5. for循环遍历给定集合所有元素,不同题目区别在于进行循环的条件,具体看例子。每当一个元素添加到当前结果中之后,要再调用递归函数,相当于固定了前缀穷举后面的变化。

  6. 调用完之后要将当前结果中最后一个元素去掉,进行下一个循环才不会重复。

    39. Combination Sum
public List<List<Integer>> combinationSum(int[] nums, int target) {        List<List<Integer>> list = new ArrayList<>();        Arrays.sort(nums);        backtrack(list, new ArrayList<>(), nums, target, 0);        return list;    }    private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, int remain, int start){        if(remain < 0) return;        else if(remain == 0) list.add(new ArrayList<>(tempList));        else{             for(int i = start; i < nums.length; i++){                tempList.add(nums[i]);                backtrack(list, tempList, nums, remain - nums[i], i); // not i + 1 because we can reuse same elements                tempList.remove(tempList.size() - 1);            }        }    }

40. Combination Sum II
1和2的区别
1中无重复,2有重复数字

public List<List<Integer>> combinationSum2(int[] candidates, int target) {        List<List<Integer>> list = new ArrayList<>();        Arrays.sort(candidates);        findSum(list,new ArrayList<Integer>(),0,candidates,target);        return list;}public void findSum(List<List<Integer>> list, List<Integer> lis, int start,int[] nums, int c) {        if(c < 0) return;        else if(c == 0) list.add(new ArrayList<>(lis));        else {            for(int i = start; i < nums.length; i++) {                if(i > start && nums[i] == nums[i-1]) continue; // 去除重复                 lis.add(nums[i]);                findSum(list,lis,i+1,nums,c - nums[i]);                lis.remove(lis.size() - 1);            }        }}
216. Combination Sum III
注意i的变化,是否去重复
 public List<List<Integer>> combinationSum3(int k, int n) {        List<List<Integer>> list = new ArrayList<>();        findKSum(list, new ArrayList<Integer>(), k, n, 1);        return list;    }    private void findKSum(List<List<Integer>> list, List<Integer> lis, int k, int sum, int start) {        if(sum < 0 || lis.size() > k) return;        else if(sum == 0 && lis.size() == k) list.add(new ArrayList<Integer>(lis));        else {            for(int i = start; i <= 9; i++) {                lis.add(i);                findKSum(list,lis,k,sum - i,i+1);                lis.remove(lis.size() - 1);            }        }    }



0 0
原创粉丝点击