leetcode 组合总和III(Java)

Leetcode汇总贴: leetcode经典编程题目(Java实现)


leetcode题目

组合总和III -- leetcode 216

题目描述

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

所有数字都是正整数。
解集不能包含重复的组合。 
示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

回溯算法

代码

package com.leetcode.array;

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

/**
 * 题目: 
 * 组合总和III -- leetcode 216
 * 
 * 题目描述:
 * 
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

所有数字都是正整数。
解集不能包含重复的组合。 
示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */
public class CombinationSumIII {
	/**
	 * 思路: 
	 * 1、回溯算法
	 */
    public List> combinationSum3(int k, int n) {
        List> res = new ArrayList<>();
        
        if (k <= 0) {
            return res;
        }
        
        addCombinations(1, k, n, new ArrayList(), res);
        
        return res;
    }
    
    private void addCombinations(int start, int k, int n, List cache, List> res) {
        if (n < 0) {
            return;
        }
        if (n == 0 && cache.size() == k) {
            res.add(new ArrayList<>(cache));
        }
        for (int i=start; i<=9; i++) {
            if (n < i) {
                return;
            }
            cache.add(i);
            addCombinations(i+1, k, n-i, cache, res);
            cache.remove(cache.size()-1);
        }
    }
}

你可能感兴趣的:(Leetcode题目)