Middle-题目26:216. Combination Sum III

原创 2016年05月31日 15:48:44

题目原文:
Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.

Ensure that numbers within the set are sorted in ascending order.
Example 1:
Input: k = 3, n = 7
Output:
[[1,2,4]]
Example 2:
Input: k = 3, n = 9
Output:
[[1,2,6], [1,3,5], [2,3,4]]
题目大意:
给出k和n,求把n拆成k个在1~9之间不重复整数之和的所有方式。
例如k=3,n=9,可以拆成9=1+2+6,9=1+2+4,9=2+3+4.
题目分析:
因为拆掉一个之后的子问题和原来是相似的(逻辑相同只是参数不同),故还是使用回溯法求解,函数写成如下形式:

backtrack(List<List<Integer>> list,List<Integer> sublist,int k,int n,int start)

其中list表示返回的数组,sublist表示当前搜索路径,k和n均为当前子问题的两个参数,start为新增的参数,代表从几开始找,问题开始时显然从1开始找。
那么递归关系是:每次找到一个i,则k=k-1,n=n-i,start=i+1
源码:(language:java)

public class Solution {
    public List<List<Integer>> combinationSum3(int k, int n) {
        List<List<Integer>> list=new ArrayList<List<Integer>>();
        backtrack(list,new ArrayList<Integer>(),k,n,1);
        return list;
    }
    private void backtrack(List<List<Integer>> list,List<Integer> sublist,int k,int n,int start) {
        if(k == 1 ) {
            if(n < 10) {
                List<Integer> sublist2=new ArrayList<Integer>(sublist);
                sublist2.add(n);
                list.add(sublist2);
                return;
            }
        }
        else {
            for(int i=start;i<(double)n/(double)k;i++) {
                sublist.add(i);
                backtrack(list,sublist,k-1,n-i,i+1);
                sublist.remove(sublist.size()-1);
            }
        }       
    }
}

成绩:
1ms,beats 52.84%,众数1ms,47.16%
Cmershen的碎碎念:
本题的代码第17行for(int i=start;i<(double)n/(double)k;i++)需要注意,如果不转换为double,会导致解空间变小。例如n=7,k=2时如果不转换相当于i<3,如果加double转换相当于i<3.5,前者会遗漏掉i=3的情况。同理如果改为i<=n/k会导致解空间变大。

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

相关文章推荐

leetcode_middle_25_216. Combination Sum III

题意: 给两个数n,k,找出所有n个各不相同的数的和是k的组合。 分析: 其实关键就是搜索遍历,怎么遍历呢?可以这样: 1,2,3    1,2,4    1,2,5  ...   1,2...

216. Combination Sum III -Medium

Question Find all possible combinations of k numbers that add up to a number n, given that only nu...

leetcode 216. Combination Sum III

class Solution { void do_once(int k,int n, map, int>&candi) { map, int>newcandi; for (map, int...

216. Combination Sum III

Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...

LeetCode #216 - Combination Sum III - Medium

Combination Sum Series Combination Sum I: Combination Sum II: Combination Sum III: Pr...

leetcode-java-216. Combination Sum III

/* Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C w...

<LeetCode OJ> 39 / 40 / 216 Combination Sum(I / II / III)

Total Accepted: 83289 Total Submissions: 274461 Difficulty: Medium Given a set of candidate num...

216. Combination Sum III

Combination Sum III 题目解析 代码实现216. Combination Sum III题目解析Find all possible combinations of k numbers...

LeetCode216:Combination Sum III

从1-9中取k个数和为n,且数不重复。首先可能想到的是用一个boolean数组记录用过的数字,Boolean数组的下标+1即为数字。但这题我们发现,选取的数组是递增的,所以无需使用一个数组记录使用过的...

【LeetCode-面试算法经典-Java实现】【216-Combination Sum III (组合数的和)】

【216-Combination Sum III (组合数的和)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-Jun-...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)