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...
  • pusude
  • pusude
  • 2017年02月07日 14:44
  • 88

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(Backtracking)(*)

翻译找出所有的k个数字相加得到数字n的组合,只有1到9的数字可以被使用,并且每个组合间需要是不同的数字集。原文Find all possible combinations of k numbers t...
  • NoMasp
  • NoMasp
  • 2016年07月17日 22:21
  • 1367

LeetCode 216. Combination Sum III 解题报告

LeetCode 216. Combination Sum III 解题报告

LeetCode笔记:216. Combination Sum III

寻找k个数相加得到n的所有组合

Leetcode——216. Combination Sum III

题目:Find all possible combinations of k numbers that add up to a number n, given that only numbers fr...

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

【216-Combination Sum III (组合数的和)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-Jun-...

LeetCode #216 - Combination Sum III - Medium

Combination Sum Series Combination Sum I: Combination Sum II: Combination Sum III: Pr...
  • Arcome
  • Arcome
  • 2016年12月20日 07:56
  • 355
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目26:216. Combination Sum III
举报原因:
原因补充:

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