• 如果您觉得本站非常有看点，那么赶紧使用Ctrl+D 收藏吧

# LeetCode – Medium – 216. Combination Sum III

2周前 (01-10) 8次浏览

• Array
• Backtracking

## Description

https://leetcode.com/problems/combination-sum-iii/

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. [1,2,1] is not valid because 1 is used twice.
``````

Example 4:

``````Input: k = 3, n = 2
Output: []
Explanation: There are no valid combinations.
``````

Example 5:

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

Constraints:

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

## Submission

``````import java.util.ArrayList;
import java.util.List;

public class CombinationSumIII {

public List<List<Integer>> combinationSum3(int size, int targetSum) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> path = new ArrayList<>();
backtracking(path, size, targetSum, 0, 1, result);
return result;
}

private void backtracking(List<Integer> path, int size, int targetSum, //
int currentSum, int startIndex, List<List<Integer>> result) {
// 剪枝
if (targetSum < currentSum)
return;

if (path.size() == size) {
if (targetSum == currentSum)
return;
}

for (int i = startIndex; i <= 9; i++) {
currentSum += i;
backtracking(path, size, targetSum, currentSum, i + 1, result);
path.remove(path.size() - 1);
currentSum -= i;
}
}
}
``````

## Test

``````import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.*;

import java.util.Arrays;

import org.hamcrest.collection.IsEmptyCollection;
import org.junit.Test;

public class CombinationSumIIITest {

@Test
@SuppressWarnings("unchecked")
public void test() {
CombinationSumIII obj = new CombinationSumIII();

assertThat(obj.combinationSum3(3, 7), containsInAnyOrder(Arrays.asList(1, 2, 4)));
assertThat(obj.combinationSum3(3, 9), containsInAnyOrder(Arrays.asList(1, 2, 6), //
Arrays.asList(1, 3, 5), Arrays.asList(2, 3, 4)));

assertThat(obj.combinationSum3(4, 1), IsEmptyCollection.empty());
assertThat(obj.combinationSum3(3, 2), IsEmptyCollection.empty());

assertThat(obj.combinationSum3(9, 45), containsInAnyOrder(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)));
}
}
``````
{{o.name}}

{{m.name}}