Leetcode-Combinations Sum II

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.
  • Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1a2 ≤ … ≤ ak).
  • 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]

Have you met this question in a real interview?

Analysis:

Since there are duplicates, for each value, we get the number of elements that are this value. We sort the array, at each step in the recursion, we try to use 0 to elementNumOfCurValue number of this value. For next step, we directly skip to the next value.

Solution:

 1 public class Solution {
 2     public List<List<Integer>> combinationSum2(int[] num, int target) {
 3         int[] candidates = num;
 4         List<List<Integer>> resSet = new ArrayList<List<Integer>>();
 5         List<Integer> curRes = new ArrayList<Integer>();
 6         if (candidates.length==0) return resSet;
 7         Arrays.sort(candidates);
 8         int cur=0,end=candidates.length-1;
 9         for (int i=0;i<candidates.length;i++)
10             if (candidates[i]>target){
11                 end = i-1;
12                 break;
13             }
14
15
16         sumRecur(candidates,cur,end,target,resSet,curRes);
17
18         return resSet;
19
20     }
21
22
23     public void sumRecur(int[] candidates, int cur, int end, int valLeft, List<List<Integer>> resSet, List<Integer> curRes){
24         if (valLeft==0){
25             List<Integer> temp = new ArrayList<Integer>();
26             temp.addAll(curRes);
27             resSet.add(temp);
28             return;
29         }
30
31         if (cur>end) return;
32
33         int newLeft = valLeft;
34         int curLen = curRes.size();
35         int nextIndex = cur;
36         while (nextIndex<=end && candidates[nextIndex]==candidates[cur]) nextIndex++;
37
38         for (int i=cur;i<nextIndex;i++)
39             if (newLeft>=candidates[i]){
40                 curRes.add(candidates[i]);
41                 newLeft -= candidates[i];
42                 sumRecur(candidates,nextIndex,end,newLeft,resSet,curRes);
43             } else
44                 break;
45
46         while (curRes.size()!=curLen) curRes.remove(curRes.size()-1);
47
48         sumRecur(candidates,nextIndex,end,valLeft,resSet,curRes);
49     }
50 }
时间: 2024-11-08 22:22:19

Leetcode-Combinations Sum II的相关文章

LeetCode: Combination Sum II [039]

[题目] 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

LeetCode——Path Sum II

Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum. For example: Given the below binary tree and sum = 22, 5 / 4 8 / / 11 13 4 / \ / 7 2 5 1 return [ [5,4,11,2], [5,8,4,5] ] 给定一个二叉树和一个值,找出所有根到叶的路径和等于

LeetCode: Path Sum II [113]

[题目] Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum. For example: Given the below binary tree and sum = 22, 5 / 4 8 / / 11 13 4 / \ / 7 2 5 1 return [ [5,4,11,2], [5,8,4,5] ] [题意] 判断二叉树中是否存在一条从根到

LeetCode: Combination Sum II 解题报告

Combination Sum II 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 ta

Leetcode#40Combination Sum II

Combination Sum II Total Accepted: 34820 Total Submissions: 138493My Submissions Question Solution 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 numb

Leetcode#113Path Sum II

Path Sum II Total Accepted: 43473 Total Submissions: 162906My Submissions Question Solution Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum. For example:Given the below binary tree and sum = 22,  

LeetCode: Path Sum II 解题报告

Path Sum II Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum. For example:Given the below binary tree and sum = 22, 5 / 4 8 / / 11 13 4 / \ / 7 2 5 1 return [ [5,4,11,2], [5,8,4,5] ] SOLUTION 1: 使用

[Leetcode] Combination Sum II

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 posi

[LeetCode] Two Sum II - Input array is sorted 两数之和之二 - 输入数组有序

Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the two numbers such that they add up to the target, where index1 mu

[LeetCode] Combination Sum II (递归)

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 posi