Middle-题目26:216. Combination Sum III

来源:互联网 发布:四九算法是虚岁 编辑:程序博客网 时间:2024/04/28 02:24

题目原文:
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会导致解空间变大。

0 0
原创粉丝点击