关闭

Middle-题目26:216. Combination Sum III

71人阅读 评论(0) 收藏 举报
分类:

题目原文:
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

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:55313次
    • 积分:3192
    • 等级:
    • 排名:第10658名
    • 原创:270篇
    • 转载:53篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论