码迷,mamicode.com
首页 > 其他好文 > 详细

组合总和 III(力扣第216题)

时间:2020-07-19 23:34:18      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:代码实现   return   搜索   输出   ==   style   允许   col   str   

题目:

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

    }

 

组合总和 III(力扣第216题)

标签:代码实现   return   搜索   输出   ==   style   允许   col   str   

原文地址:https://www.cnblogs.com/yxym2016/p/13340849.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!