Combination Sum II:允许重复的数组中选取若干元素使和为某一给定值

来源:互联网 发布:da8da六爻排盘软件 编辑:程序博客网 时间:2024/06/16 23:42

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

Each number in C may only be used once in the combination.

Note:

  • All numbers (including target) will be positive integers.
  • The solution set must not contain duplicate combinations.

For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8
A solution set is: 

[  [1, 7],  [1, 2, 5],  [2, 6],  [1, 1, 6]]

例如1,1,1,1 target为2,输出[1,1]

思路:按照dfs遍历。麻烦的是元素中可能存在重复的元素,但结果里去不能有重复的结果。所以两种办法:第一种是穷举所有结果,再去重;第二种是便利时就不考虑重复结果。第二种更方便一些。

下图是一个例子,圆圈与方框是表示当前已保存的元素,三角是正在遍历的元素,圆圈与方框中元素相同即被看成是同一种情况。


class Solution {    public List<List<Integer>> combinationSum2(int[] candidates, int target) {        List<List<Integer>> list = new ArrayList<>();       Arrays.sort(candidates);        dfs(candidates,0,0,target,list);            return list;            }    static int[] index = new int[10000];     public static void dfs(int[] candidates,int sum,int i,int target,List list){        if(sum>target) return;        if(sum==target){            ArrayList<Integer> l = new ArrayList();            for(int j=0;j<candidates.length;j++){                if(index[j]!=0){                                      l.add(candidates[j]);                }            }            list.add(l);            return;        }else{            for(int j = i ;j<candidates.length;j++){                if(j>i&&candidates[j]==candidates[j-1]) continue;                index[j]++;                dfs(candidates,sum+candidates[j],j+1,target,list);                index[j]--;            }        }    }}










阅读全文
0 0
原创粉丝点击