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 216: Combination Sum III

leetcode 216: Combination Sum III java python c++
  • xudli
  • xudli
  • 2015年05月29日 09:17
  • 5746

leetcode 216 Combination Sum III java 算法

题目描述: 给一个正整数n,将其分解为k个数的加和,找出所有的k个数的组合,并且这些组合相互唯一,例如1,2,3和3,2,1视为同一组 算法思路: 当选择添加这k个数中的第m个数时,则第m个数可...
  • austyjt
  • austyjt
  • 2016年07月15日 16:09
  • 164

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

【216-Combination Sum III (组合数的和)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-Jun-...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月28日 06:58
  • 3682

[LeetCode 216] Combination Sum III

Find all possible combinations of k numbers that add up to a number n, given that only numbers from...
  • sbitswc
  • sbitswc
  • 2015年09月16日 15:35
  • 2052

LeetCode 216. Combination Sum III(数字之和)

原题网址:https://leetcode.com/problems/combination-sum-iii/ Find all possible combinations of k num...
  • jmspan
  • jmspan
  • 2016年05月06日 04:17
  • 333

leetcode【39+40+216+377 Combination Sum 相关】【python】

39Combination Sum是说让我们在给定数组C中找到所有的组合,使得组合中数字的和是target值。并且组合里的数字可以重复,也就是不限制C中每一个数字的使用。 这明显是回溯啦,大家记得让...
  • u014251967
  • u014251967
  • 2016年12月13日 16:38
  • 345

216. Combination Sum III

Find all possible combinations of k numbers that add up to a number n, given that only numbers fro...
  • wo111180611
  • wo111180611
  • 2016年03月12日 03:40
  • 84

216. Combination Sum III**

Find all possible combinations of k numbers that add up to a number n, given that only numbers fro...
  • alwaystry
  • alwaystry
  • 2017年01月15日 16:42
  • 71

216. Combination Sum III。

Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
  • Leafage_M
  • Leafage_M
  • 2018年02月20日 14:34
  • 76

【Leetcode】216. Combination Sum III

216. Combination Sum III Find all possible combinations of k numbers that add up to a number n,...
  • zhizhi_zhizhi_zhizhi
  • zhizhi_zhizhi_zhizhi
  • 2017年02月27日 22:26
  • 67
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目26:216. Combination Sum III
举报原因:
原因补充:

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