Skip to main content

Leetcode 40: Combination Sum II

 

1. Problem Statement (Simple Explanation):


You are given:

  • An array candidates (may contain duplicates).

  • An integer target.

You must return all unique combinations of numbers from candidates such that:

  • The sum of the chosen numbers equals target.

  • Each number can be used at most once in each combination.

  • The result must not contain duplicate combinations.

  • Return combinations in any order.


2. Examples:


Example 1:

Input:

candidates = [10,1,2,7,6,1,5]

target = 8

Possible unique combinations:

  • [1,1,6]

  • [1,2,5]

  • [1,7]

  • [2,6]

Output:

[

  [1,1,6],

  [1,2,5],

  [1,7],

  [2,6]

]


Example 2:

Input:

candidates = [2,5,2,1,2]

target = 5

Valid unique combinations:

  • [1,2,2]

  • [5]

Output:

[

  [1,2,2],

  [5]

]


3. Key Differences vs. Combination Sum (Problem 39):


  • Here, each candidate can be used at most once.

  • candidates may contain duplicates, but the result must have no duplicate combinations.

  • We must carefully skip duplicates at the same decision depth.

So the main changes:

  • We sort candidates.

  • We move forward with i + 1 when recursing (no reuse).

  • We skip candidates[i] if it is the same as candidates[i-1] at the same depth.


4. Approach – Backtracking with Sorting and Duplicate Skipping:


Intuition:


Use backtracking (DFS):

  • Sort candidates so duplicates are adjacent.

  • At each recursive call, we iterate over indices i from start to end:

    • If i > start and candidates[i] == candidates[i-1], skip this i (to avoid duplicate combinations starting with the same prefix).

    • Include candidates[i] once:

      • Add to current path.

      • Recurse with start = i + 1 (no reuse).

      • Backtrack.

We also prune when:

  • remaining < 0 → stop.

  • If sorted, we can break when candidates[i] > remaining (optional optimization).


Algorithm (Step-by-Step):


  1. Sort candidates.

  2. Define result list results.

  3. Define backtrack(start, remaining, current):

    • If remaining == 0:

      • Add a copy of current to results.

      • Return.

    • For i from start to len(candidates)-1:

      • If i > start and candidates[i] == candidates[i-1]:

        • continue (skip duplicates at this level).

      • If candidates[i] > remaining:

        • break (since further ones will be even larger).

      • Add candidates[i] to current.

      • Call backtrack(i + 1, remaining - candidates[i], current) (note i+1, not i).

      • Remove last element from current (backtrack).

  4. Call backtrack(0, target, []).

  5. Return results.


Pseudo-code:



Complexity:


Let:

  • n = len(candidates).

Complexity is exponential in general (combinatorial):

  • Time: worst-case O(2n), but constrained by small target and pruning.

  • Space:

    • Recursion depth up to n.

    • Current combination list up to length n.

    • So O(n) auxiliary space.

Constraints (target ≤ 30, candidates[i] ≤ 50) keep it practical.


5. Java code:



6. C code:



7. C++ code:



8. Python code:



9. JavaScript code:



Comments

Popular posts from this blog

Leetcode 1: Two Sum

  Leetcode Link: https://leetcode.com/problems/two-sum/ 1. Problem Statement (Simple Explanation) You are given: An array of integers nums An integer target You need to  return the indices of two numbers in the array  such that: Conditions: Each input has  exactly one solution . You  cannot use the same element twice . You can return the answer in  any order . 2. Examples Example 1 Input:                                    nums = [2, 7, 11, 15], target = 9 Output:                                 [0, 1] Explanation:                     nums[0]+nums[1]=2+7=9              So we return [0, 1]. Example 2 Input:           ...

Leetcode 3: Longest Substring Without Repeating Characters

  Leetcode Link 1. Problem Statement (Simple Explanation) You are given a string s. You need to find the length of the longest substring of s that does not  contain any repeated characters. A substring is a contiguous sequence of characters in the string. You must return an integer length, not the substring itself. 2. Examples Example 1 Input: s = "abcabcbb" Output: 3 Explanation: Some substrings without repeating characters: "abc", "bca", "cab"The longest length is 3. Example 2 Input: s = "bbbbb" Output: 1 Explanation: All substrings that are valid are just "b". The longest length is 1. Example 3 Input:   s = "pwwkew" Output:   3 Explanation: Possible substrings without repetition: "pw", "wke", "kew". "wke" or "kew" have length 3. "pwke" is not valid because it’s not contiguous in the original string (p and k are separated by ww). Constraints...

Leetcode 2: Add Two Numbers

Leetcode Link: https://leetcode.com/problems/add-two-numbers/ 1. Problem Statement (Simple Explanation) You are given  two non-empty linked lists , l1 and l2, that represent two non-negative integers. Each node contains a  single digit . The digits are stored in  reverse order  (i.e., the 1’s digit is at the head). You need to  add the two numbers  and return the  sum as a linked list , also in reverse order. You can assume: There are  no leading zeros , except when the number itself is 0. 2. Examples Example 1 Input:                l1 = [2,4,3]                l2 = [5,6,4]           Interpreting linked lists as numbers (reverse order): l1 represents 342 l2 represents 465 Output:                [7,0,8] Explanation:        ...