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会导致解空间变大。
- Middle-题目26:216. Combination Sum III
- Middle-题目54:39. Combination Sum
- Middle-题目79:40. Combination Sum II
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- Middle-题目25:24. Swap Nodes in Pairs
- 使用自定义View绘制右侧导航栏
- 第十四周项目三 数组类模板
- 做题笔记
- C++常用排序算法总结
- Middle-题目26:216. Combination Sum III
- IAR中volatile使用
- s:iterator 的用法
- java面向对象(面试题)
- Android服务二 创建绑定服务
- libevent入门
- JavaScript学习--Item27 异步编程异常解决方案
- Middle-题目27:64. Minimum Path Sum
- TotalCommander快捷键