LeetCode - Medium - 216. Combination Sum III

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)));
	}
}

猜你喜欢

转载自blog.csdn.net/u011863024/article/details/112450619