216. Combination Sum III
来源:互联网 发布:阿里云os5.1系统root 编辑:程序博客网 时间:2024/04/30 19:23
Question
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.
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是不定的, 所以无法用LOOP(循环). 回溯法是此类题的常用解法. 注意要新建一个list 放入结果中, 否则放入的reference 会指向原来的不断变化的list,result.add(new ArrayList(cur));
代码
public class Solution { public List<List<Integer>> combinationSum3(int k, int n) { List<List<Integer>> result = new ArrayList<List<Integer>>(); List<Integer> list = new ArrayList<Integer>(); if(k < 1 || k > 9 || n < 1 || n > 45) return result; generate(result,list,1,k,n); return result; } public void generate(List<List<Integer>> result,List<Integer> list,int start,int k,int n){ //难点在于如何取得所有不重复的组合数 if(list.size() == k && n == 0){ result.add(new ArrayList(list)); return; } else if(list.size() >= k || n <= 0) return; for(int i = start;i <= 9;i++){ list.add(i); generate(result,list,i + 1,k,n - i); list.remove(list.size() - 1); } }}
结果及分析
递归这种分析时间复杂度的就是看最后遍历的次数,回溯法难就难在不好理解遍历的顺序。此次遍历的顺序是:[1,2,3]->[1,2,4]->[1,2,5]->[1,2,6]->[1,2,7]->[1,2,8]->[1,2,9]->[1,3,4]->[1,3,5]…….
二刷
思路还是一样的,利用回溯法和dfs,code更简单了一点。
CODE
public class Solution { public List<List<Integer>> combinationSum3(int k, int n) { List<List<Integer>> res = new ArrayList<>(); if(k == 0 || n == 0) return res; List<Integer> temp = new ArrayList<>(); helper(res,temp,k,n,1); return res; } public void helper(List<List<Integer>> res,List<Integer> temp,int k,int n,int num){ if(temp.size() == k && n == 0){ res.add(new ArrayList<>(temp)); return; } else if(temp.size() > k || n < 0) return; for(int i = num;i <= 9;i++){ if(i > n) return; temp.add(i); n -= i; helper(res,temp,k,n,i + 1); n += i; temp.remove(temp.size() - 1); } }}
0 0
- 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
- 216. Combination Sum III
- 216. Combination Sum III
- 216. Combination Sum III
- LeNet模型简介
- Java NIO中Selector类源码
- 不能相邻的字符对
- 64. Minimum Path Sum
- 39. Combination Sum
- 216. Combination Sum III
- Linux下的一些问题收集及解决方法(一)
- 初探swift语言的学习笔记二(可选类型?和隐式可选类型!)
- C# Regex类详解
- Spark安装
- Python语言学习讲解五:列表(List)操作方法详解
- Android开发视频源码
- kernel version 367.48. does not match DSO version 367.57
- 安卓实现沉浸式状态栏