组合总和 II

随声附和 提交于 2020-02-29 15:26:47

题目:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。

说明:

所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。

解题思路

采用回溯法:采用一个stack添加一个小于目标数的数组元素,同时将目标数替换为目标数与数组元素的差。进行遍历迭代。首先采用for循环遍历数组元素,将遍历后产生的list与target作为下一次迭代的初始值,同时将当前遍历元素下表加1使数组中的元素在list中只出现一次。

代码:

class Solution {
    public List<List<Integer>> biglist = new ArrayList<List<Integer>>();
    public int[] candidates;
    public int len;
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        int len = candidates.length;
        if (len == 0) {
            return biglist;
        }
        Arrays.sort(candidates);
        this.len = len;
        this.candidates = candidates;
        combination(target,new Stack<Integer>(),0);
        return biglist;
    }
    public void combination(int target,Stack<Integer> list,int start){
        if(target==0&&!biglist.contains(new ArrayList<Integer>(list))){
            //if (target == 0){
            biglist.add(new ArrayList<Integer>(list));
            return;}
        for(int i=start;i < candidates.length&&target - candidates[i] >= 0;i++){
            list.add(candidates[i]);
            combination(target-candidates[i],list,i+1);
            list.pop();
        }
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!