Java——组合总和(3)

  • Post author:
  • Post category:java

题目链接

leetcode在线oj——组合总和(3)

题目描述

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

只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

题目示例

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

输入: 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
没有其他符合的组合了。

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

题目提示

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

题目思路

我们可以使用递归,将所有可能的组合方式都排列出来,然后验证其总和是否为n,如果是n就将结果添加到list中

我们需要一个全局变量list,在所有递归中使用,并且递归需要定义当前的位置,1-9一共n个,数字总数k,需要的组合的总和sum,如果当前list的size已经超过k,或者就算当前list加上后面所有的数字都无法到达k个,说明已经不满足条件了,就返回上一个状态

如果当前list的size正好等于k,那么就验证list所有数字加起来是否为n,是就添加进result中,否则就返回上一个状态

完整代码

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> list = new ArrayList<>();

    public List<List<Integer>> combinationSum3(int k, int n) {
       dfs(1, 9, k, n);
       return result;
    }

    private void dfs(int cur, int n, int k, int sum) {
        if(list.size() + (n - cur + 1) < k || list.size() > k){
            return;
        }
        if(list.size() == k){
            int count = 0;
            for (int x:list) {
                count += x;
            }
            if(count == sum){
                result.add(new ArrayList(list));
                return;
            }
        }
        list.add(cur);
        dfs(cur + 1, n, k, sum);
        list.remove(list.size() - 1);
        dfs(cur + 1, n, k, sum);
    }
}

代码执行流程图

在这里插入图片描述


版权声明:本文为m0_60867520原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。