Topic
- 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
Analysis
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)
result.add(new ArrayList<>(path));
return;
}
for (int i = startIndex; i <= 9; i++) {
path.add(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)));
}
}