216. 组合总和 III

找出所有相加之和为 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]]

 

本题k相当于了树的深度,9(因为整个集合就是9个数)就是树的宽度。

例如 k = 2,n = 4的话,就是在集合[1,2,3,4,5,6,7,8,9]中求 k(个数) = 2, n(和) = 4的组合。

选取过程如图:

216. 组合总和 III

图中,可以看出,只有最后取到集合(1,3)和为4 符合条件。

 

回溯三部曲

  • 确定递归函数参数
  • 确定终止条件
  • 单层搜索过程

别忘了处理过程 和 回溯过程是一一对应的,处理有加,回溯就要有减!

class Solution {

    private List<List<Integer>> res=new ArrayList<>();;
    private LinkedList<Integer> path=new LinkedList<>();

    public List<List<Integer>> combinationSum3(int k, int n) {
        process(n,0,1,k);
        return res;

    }

    private void process(int targetSum,int curSum,int startIndex,int k){
        //base case
        if(path.size()==k){
            if(targetSum==curSum){
                res.add(new ArrayList<>(path));
            }
        }
        if(curSum>targetSum){
            return;
        }
        for(int i=startIndex;i<=9-(k-path.size())+1;i++){
            curSum+=i;
            path.add(i);
            process(targetSum,curSum,i+1,k);
            // 回溯
            path.removeLast();
            // 回溯
            curSum-=i;
        }

    }
}

  

  

上一篇:模拟卷Leetcode【普通】437. 路径总和 III


下一篇:vmnetbridge.dll找不到怎么解决-vmnetbridge.dll修复工具下载