LeetCode 0216. Combination Sum III Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0216. Combination Sum III

Description

Find all valid combinations of k numbers that sum up to n such that the following conditions are true:

  • Only numbers 1 through 9 are used.
  • Each number is used at most once.

Return a list of all possible valid combinations. The list must not contain the same combination twice, and the combinations may be returned in any order.

 

Example 1:

Input: k = 3, n = 7
Output: [[1,2,4]]
Explanation:
1 + 2 + 4 = 7
There are no other valid combinations.

Example 2:

Input: k = 3, n = 9
Output: [[1,2,6],[1,3,5],[2,3,4]]
Explanation:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
There are no other valid combinations.

Example 3:

Input: k = 4, n = 1
Output: []
Explanation: There are no valid combinations.
Using 4 different numbers in the range [1,9], the smallest sum we can get is 1+2+3+4 = 10 and since 10 > 1, there are no valid combination.

 

Constraints:

  • 2 <= k <= 9
  • 1 <= n <= 60

Solutions

Solution 1: Pruning + Backtracking (Two Approaches)

We design a function dfs(i, s), which represents that we are currently enumerating the number i, and there are still numbers with a sum of s to be enumerated. The current search path is t, and the answer is ans.

The execution logic of the function dfs(i, s) is as follows:

Approach One:

  • If s = 0 and the length of the current search path t is k, it means that a group of answers has been found. Add t to ans and then return.
  • If i \gt 9 or i \gt s or the length of the current search path t is greater than k, it means that the current search path cannot be the answer, so return directly.
  • Otherwise, we can choose to add the number i to the search path t, and then continue to search, i.e., execute dfs(i + 1, s - i). After the search is completed, remove i from the search path t; we can also choose not to add the number i to the search path t, and directly execute dfs(i + 1, s).

Another approach:

  • If s = 0 and the length of the current search path t is k, it means that a group of answers has been found. Add t to ans and then return.
  • If i \gt 9 or i \gt s or the length of the current search path t is greater than k, it means that the current search path cannot be the answer, so return directly.
  • Otherwise, we enumerate the next number j, i.e., j ∈ [i, 9], add the number j to the search path t, and then continue to search, i.e., execute dfs(j + 1, s - j). After the search is completed, remove j from the search path t.

In the main function, we call dfs(1, n), i.e., start enumerating from the number 1, and the remaining numbers with a sum of n need to be enumerated. After the search is completed, we can get all the answers.

The time complexity is (C_{9}^k × k), and the space complexity is O(k).

PythonJavaC++GoTypeScriptJavaScriptRustC#PythonJavaC++GoTypeScriptJavaScriptC#
class Solution: def combinationSum3(self, k: int, n: int) -> List[List[int]]: def dfs(i: int, s: int): if s == 0: if len(t) == k: ans.append(t[:]) return if i > 9 or i > s or len(t) >= k: return t.append(i) dfs(i + 1, s - i) t.pop() dfs(i + 1, s) ans = [] t = [] dfs(1, n) return ans(code-box)

Solution 2: Binary Enumeration

We can use a binary integer of length 9 to represent the selection of numbers 1 to 9, where the i-th bit of the binary integer represents whether the number i + 1 is selected. If the i-th bit is 1, it means that the number i + 1 is selected, otherwise, it means that the number i + 1 is not selected.

We enumerate binary integers in the range of [0, 2^9). For the currently enumerated binary integer mask, if the number of 1s in the binary representation of mask is k, and the sum of the numbers corresponding to 1 in the binary representation of mask is n, it means that the number selection scheme corresponding to mask is a group of answers. We can add the number selection scheme corresponding to mask to the answer.

The time complexity is O(2^9 × 9), and the space complexity is O(k).

Similar problems:

PythonJavaC++GoTypeScriptJavaScriptC#
class Solution: def combinationSum3(self, k: int, n: int) -> List[List[int]]: ans = [] for mask in range(1 << 9): if mask.bit_count() == k: t = [i + 1 for i in range(9) if mask >> i & 1] if sum(t) == n: ans.append(t) return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !