LeetCode-组合总和 III

1,154 阅读1分钟

算法记录

LeetCode 题目:

  找出所有相加之和为 n 的 k 个数的组合,且满足下列条件,只使用数字1到9、每个数字最多使用一次。

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


说明

一、题目

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

二、分析

  • 题目就是一个简单的深度优先问题,因为是从 1 - 9 的不可重复数据,我们就可以直接限定取值区间了,不用太多的其他计算。
  • 递归的基本条件就是从当前区间中取出 k 个数字组合成和为 n 的序列,每次添加一个数字就将目标值减去,直到 k == 0 && n == 0 这个时候就可认为是一个符合条件的序列。
  • 其余的出现任意一个为零的情况都应该是递归的出口,避免栈溢出。
  • 因为不能重复使用数字,因此下一个数字的索引区间一定是在当前数字之后的,也就是在 +1 的数据区间进行查找。
class Solution {
    private List<List<Integer>> ret = new ArrayList();
    private List<Integer> temp = new ArrayList();
    public List<List<Integer>> combinationSum3(int k, int n) {
        dfs(1, 9, n, k);
        return ret;
    }
    public void dfs(int start, int end, int k, int n) {
        if(k == 0 && n == 0) {
            ret.add(new ArrayList(temp));
            return;
        }
        if(k <= 0 || n <= 0) return;
        for(int i = start; i <= end; i++) {
            temp.add(i);
            dfs(i + 1, end, k - i, n - 1);
            temp.remove(temp.size() - 1);
        }
    }
}

总结

深度优先遍历的方法定义。