Combination_Sum_II

来源:互联网 发布:淘宝售后换货申请 编辑:程序博客网 时间:2024/06/01 21:11

题目描述:

 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.
(给定一组候选数字(C)和一个目标数(T),在C中找出所有唯一的组合使其总和为T。
 C中的每个数字只能在组合中使用一次。
注:
 所有数字(包括目标)都是正整数。
 解决方案集不得包含重复组合。)
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]
]

思路:这个题和Combination_Sum几乎完全一样,只不过这个允许有重复的元素,以及每个元素只能用一次,所以要在for循环里进行一个重复元素的判断,以及在元素的抽取上不能抽原来已经抽取过的元素。

public class Combination_Sum_II {public static List<List<Integer>> combinationSum2(int[] candidates, int target) {List<List<Integer>> result = new ArrayList();if(target==0||candidates.length==0)return result;Arrays.sort(candidates);List<Integer> mid = new ArrayList<Integer>();solve(result,mid,candidates,target,0);return result;            }public static void solve(List<List<Integer>> result,List<Integer> mid,int[] candidates,int target,int index){if(target==0){result.add(new ArrayList(mid));}else{if(target<0)return;//i是指第i个元素for(int i=index;i<candidates.length;i++){if(i>index && candidates[i]==candidates[i-1]) continue; mid.add(candidates[i]);solve(result,mid,candidates,target-candidates[i],i+1);mid.remove(mid.size()-1);}}}public static void main(String[] args) {int candidates[] = {10, 1, 2, 7, 6, 1, 5};int  target = 8;List<List<Integer>> result = combinationSum2(candidates,target);for(int i=0;i<result.size();i++){for(int j=0;j<result.get(i).size();j++){System.out.print(result.get(i).get(j)+" ");}System.out.println("\n");}}}


原创粉丝点击