zoukankan      html  css  js  c++  java
  • 组合总和 III(力扣第216题)

    题目:

      找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

    说明:

      所有数字都是正整数。
      解集不能包含重复的组合。 

    示例:

    输入: k = 3, n = 7
    输出: [[1,2,4]]

    分析:

      明确题目的限制条件:1、组合中只允许存在1-9的数字;2、组合中元素的个数是k个;3、k个1-9范围内的数相加之和为n;4、组合中的元素不允许重复

      可见,限制条件有很多,还是采用DFS和回溯的方法求解,只不过现在DFS的搜索路径长度有了固定的长度,也就是k,并且搜索过程中,每个节点的值只能是1-9的数。不能重复可以通过将下一次搜索的节点值设置为当前搜索节点值加1,这样就保证了不会产生重复得数字。在搜索的过程中,一旦搜索路径达到了规定长度并且此时路径上的节点值之和并不是n那么就立刻返回。

      总之,整体的思路,和组合一、二差不多,只不过加一些条件即可。

    具体的代码实现如下:

    private List<List<Integer>> reslist;
    
        public List<List<Integer>> combinationSum3(int k, int n) {
    
            if (k > n){
                return new ArrayList<>();
            }
    
            reslist = new ArrayList<>();
            List<Integer> curlist = new ArrayList<>();
    
            combinationCur(k,1,n,curlist);
    
            return reslist;
        }
    
        private void combinationCur(int k, int s,int n, List<Integer> curlist) {
    
            if (curlist.size() == k && n != 0){
                return;
            }
            if (n == 0){
    
                if (curlist.size() == k){
                    reslist.add(new ArrayList<>(curlist));
    
                }
    
                return;
            }
    
            for (int i = s; i <= 9; i++) {
    
                curlist.add(i);
                combinationCur(k,i+1,n-i,curlist);
                curlist.remove(curlist.size()-1);
            }
    
        }
  • 相关阅读:
    11月1号笔试题总结
    10月30笔试题总结
    web前端常用单词
    9月13日·碎碎念
    python 匿名函数
    python 二分法查找
    python 递归
    python内置函数
    python 列表生成式
    python 生成器
  • 原文地址:https://www.cnblogs.com/yxym2016/p/13340849.html
Copyright © 2011-2022 走看看