40. Combination Sum II

来源:互联网 发布:淘宝房间吸顶灯 编辑:程序博客网 时间:2024/05/23 20:09

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]]

題意:將數組內的元素(元素可重複)組合出目標數,並打印出所有組合,但所有元素只能用一次

因為這題的數組是無序的,故需要先排序才能進行dfs(避免答案重複) 


package LeetCode.Medium;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class CombinationSumII {/* * 因為這題的數組是無序的,故需要先排序才能進行dfs(避免答案重複)  */    public List<List<Integer>> combinationSum2(int[] candidates, int target) {        List<List<Integer>> result = new ArrayList<>();        if(candidates == null || candidates.length == 0)            return result;                //先排序        Arrays.sort(candidates);                List<Integer> temp = new ArrayList<>();                //開始歷遍        helper(candidates, target, 0, 0, temp, result);                return result;    }        void helper(int[] candidates, int target, int cur_val, int m, List<Integer> temp, List<List<Integer>> result) {        //若目前結果大於target即可跳出        if(cur_val > target)            return;                if(cur_val == target) {            //若結果已經有重複,則跳出            if(result.contains(temp))                return;                        result.add(new ArrayList<>(temp));            return;        }                for(int i = m; i < candidates.length; i ++) {            temp.add(candidates[i]);            //因為每個元素只能用一次,故要從m + 1開始走            //ex: 1 2 3 4 -> step1. 1, step2. 2, step3. 3, step4. 4            helper(candidates, target, cur_val + candidates[i], i + 1, temp, result);                        //dfs最後都要刪去最後一個元素            temp.remove(temp.size() - 1);        }    }}


原创粉丝点击