组合总和3 中等🌟🌟🌟

问题描述

原文链接:216. 组合总和 III

找出所有相加之和为 nk 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字最多使用一次

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。

示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。

示例 3:

输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。

提示:

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

代码实现

Java

class Solution {
    // 
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> temp = new ArrayList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {

        backTrace(n, k, 1, 0);
        return res;
    }

    void backTrace(int n, int k, int index, int sum){
        // 优化
        if(sum > n){
            return;
        }

        if((9 - index + 1) + temp.size() < k){
            return;
        }
        // 结束条件
        if(temp.size() == k){
            if(sum == n){
                res.add(new ArrayList<>(temp));
            }
            return;
        }
        // 回溯
        for(int i = index; i <= 9; i ++){
            // 选其中一个元素
            temp.add(i);
            sum = sum + i;
            backTrace(n, k, i + 1, sum);
            // 撤销处理
            temp.remove(temp.size() - 1);
            sum = sum - i;
        }
    }
}

Python

class Solution(object):
    def combinationSum3(self, k, n):
        """
        :type k: int
        :type n: int
        :rtype: List[List[int]]
        """
        res = []
        temp = []

        def backTrace(n, k, index, sum):
            if sum > n:
                return

            if (9 - index + 1) + len(temp) < k:
                return

            if len(temp) == k:
                if sum == n:
                    res.append(temp[:])
                return

            for i in range(index, 10):
                temp.append(i)
                sum += i
                backTrace(n, k, i + 1, sum)
                temp.pop()
                sum -= i

        backTrace(n, k, 1, 0)
        return res

C++

class Solution {
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        vector<vector<int>> res;
        vector<int> temp;

        function<void(int, int, int, int)> backTrace = [&](int n, int k, int index, int sum) {
            if (sum > n) {
                return;
            }

            if ((9 - index + 1) + temp.size() < k) {
                return;
            }

            if (temp.size() == k) {
                if (sum == n) {
                    res.push_back(temp);
                }
                return;
            }

            for (int i = index; i <= 9; i++) {
                temp.push_back(i);
                sum += i;
                backTrace(n, k, i + 1, sum);
                temp.pop_back();
                sum -= i;
            }
        };

        backTrace(n, k, 1, 0);
        return res;
    }
};

Go

func combinationSum3(k int, n int) [][]int {
    var res [][]int
    var temp []int

    var backTrace func(int, int, int, int)
    backTrace = func(n, k, index, sum int) {
        if sum > n {
            return
        }

        if (9-index+1)+len(temp) < k {
            return
        }

        if len(temp) == k {
            if sum == n {
                copyTemp := make([]int, len(temp))
                copy(copyTemp, temp)
                res = append(res, copyTemp)
            }
            return
        }

        for i := index; i <= 9; i++ {
            temp = append(temp, i)
            sum += i
            backTrace(n, k, i+1, sum)
            temp = temp[:len(temp)-1]
            sum -= i
        }
    }

    backTrace(n, k, 1, 0)
    return res
}

发表评论

后才能评论