回溯算法之组合总数

题目

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

思路

因为题目限制只允许含有1-9的正整数,所以只要遍历1-9,然后在回溯函数前加一个判断,只要满足条件就返回,代码如下:

class Solution {
    List<List<Integer>> com = new ArrayList<>();
    public List<List<Integer>> combinationSum3(int n, int k) {
        traceBack(n,k,0,1,new ArrayList<>());
        return com;
    }
    public void traceBack(int n,int k,int sum,int start,List<Integer> list){
        if (sum==n&&k==0){
                com.add(new ArrayList<Integer>(list));
                return;
        }
        
        for(int i=start;i<10;i++){
            list.add(i);
            traceBack(n,k-1,sum+i,i+1,list);
            list.remove(list.size()-1);
        }
    }
}

这里递归的关键是将每一次遍历的数都加入list内,当满足条件时就返回,若不满足则将最后一个元素移除然后进入下一次遍历;回溯的关键是要做到先进后出,所以我移除了列表最后一个元素。
sum的作用是用来计算当前加入list内的元素的总值,而当满足条件时return退出当次递归,避免掉不必要的循环,然后移除list最后一个元素然后加入下一次遍历。
start是用来计算当此递归内的遍历是从哪个数开始,去掉不需要的递归,在回溯中被称作剪枝。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简述 极客时间算法40讲中所出现的leetcode算法题 题目 【链表】reverse-linked-list(反...
    BestbpF阅读 4,496评论 0 4
  • 1)这本书为什么值得看: Python语言描述,如果学的Python用这本书学数据结构更合适 2016年出版,内容...
    孙怀阔阅读 12,624评论 0 15
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,738评论 0 89
  • 动态规划 111. 爬楼梯思路类似斐波那契数列注意考虑第 0 阶的特殊情况 272. 爬楼梯 II思路类似上题,只...
    6默默Welsh阅读 2,456评论 0 1
  • 他站在離我不遠的地方張開雙臂 等待我投入他的懷抱 陽光明媚,蔚藍的天空沒有一朵白雲 閃亮閃亮地 就這樣,我們擁抱在...
    R珺阅读 182评论 0 0