Leetcode 之 Combination Sum系列
39. Combination Sum
1.Problem
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]]
2.Solution
题目的大意是给定一个元素不存在重复的一维数组candidates和一个目标数target,输出由一位数组中的数可以组成target的所有组合类型,注:candidates中的数可以重复使用的。
对给定的数组进行排序,然后针对target进行回溯。
3.Code
package test; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; public class TaskTest {
private List<List<Integer>> result = new ArrayList<List<Integer>>();
private int[] temp;
public static void main(String[] args) {
int[] a = {2,3,6,7}; new TaskTest().combinationSum(a,7);
//System.out.println();
} public List<List<Integer>> combinationSum(int[] candidates, int target) {
//[2, 3, 6, 7] and target 7
this.temp = candidates;
Arrays.sort(temp);
List<Integer> current = new ArrayList<>();
backTracing(current,0,target);
System.out.println(this.result.toString());
return result;
} public void backTracing(List<Integer> current , int index , int target) {
if ( target == 0 ) {
List<Integer> list = new ArrayList<>(current);
result.add(list);
} else {
for ( int i = index ; i < temp.length && temp[i] <= target ; i++ ) {
current.add(temp[i]);
backTracing(current,i,target - temp[i]);
current.remove(new Integer(temp[i]));
}
}
}
}
4.提交Leetcode的代码

40. Combination Sum II
1.Problem
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
2.Soluton
Combination Sum II跟 I比不同点在于,II中的一维数组中元素允许重复,但是组成target的每个元素仅允许被使用一次
- backTracing(current,i + 1 ,target - temp[i]); 位置变为 i + 1
- 处理结果中存在的重复问题
- 输出的结果跟顺序无关,即([[1,1,6],[1,2,5],[1,7],[2,6]]) 和([[1,2,5],[1,1,6],[2,6],[1,7]])是相同的,都是正确的结果
3.Code
package test; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set; public class TaskTest {
private List<List<Integer>> result = new ArrayList<List<Integer>>();
private int[] temp;
public static void main(String[] args) {
int[] a = {1,1,2,5,6,7,10}; new TaskTest().combinationSum(a,8);
//System.out.println();
} public List<List<Integer>> combinationSum(int[] candidates, int target) {
//[2, 3, 6, 7] and target 7
this.temp = candidates;
Arrays.sort(temp);
List<Integer> current = new ArrayList<>();
backTracing(current,0,target);
System.out.println(this.result.toString());
Set<List<Integer>> set = new HashSet<>();
for (List<Integer> l : result ) {
if ( !set.contains(l)) {
set.add(l);
}
}
System.out.println(set.toString());
result.clear();
Iterator<List<Integer>> i = set.iterator();
while ( i.hasNext() ) {
result.add(i.next());
}
System.out.println(result.toString());
return result;
} public void backTracing(List<Integer> current , int index , int target) {
if ( target == 0 ) {
List<Integer> list = new ArrayList<>(current);
result.add(list);
} else {
for ( int i = index ; i < temp.length && temp[i] <= target ; i++ ) {
current.add(temp[i]);
backTracing(current,i + 1 ,target - temp[i]);
current.remove(new Integer(temp[i]));
}
}
}
}
4.提交Leetcode的代码

216. Combination Sum III
1.Problem
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]]
2.Solution
一维数组固定为{1,2,3,4,5,6,7,8,9},要求了组成target的数的个数,同样要求数字不能重复使用
3.Code
package test; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set; public class TaskTest {
private List<List<Integer>> result = new ArrayList<List<Integer>>();
private int[] temp = {1,2,3,4,5,6,7,8,9};
public static void main(String[] args) {
new TaskTest().combinationSum(3,9);
//System.out.println();
} public List<List<Integer>> combinationSum(int k, int target) {
//[2, 3, 6, 7] and target 7
List<Integer> current = new ArrayList<>();
backTracing(current,0,target);
for ( int i = 0 ; i < result.size() ; i++ ) {
List<Integer> l = result.get(i); if (l.size() != k ) {
System.out.println(l.toString());
result.remove(i);
i--;
}
}
System.out.println(result.toString());
return result;
} public void backTracing(List<Integer> current , int index , int target) {
if ( target == 0 ) {
List<Integer> list = new ArrayList<>(current);
result.add(list);
} else {
for ( int i = index ; i < temp.length && temp[i] <= target ; i++ ) {
current.add(temp[i]);
backTracing(current,i + 1 ,target - temp[i]);
current.remove(new Integer(temp[i]));
}
}
}
}
4.提交Leetcode的代码

377. Combination Sum IV
1.Problem
Given an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target.
Example:
nums = [1, 2, 3]
target = 4 The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1) Note that different sequences are counted as different combinations. Therefore the output is 7.
2.Solution
动态规划,转移方程为:dp[n] = dp[n] + dp[n-nums[k]] (dp[0] = 1, 即n - nums[k] == 0时 ),dp[i] 代表给定的数组能组成i的种类数
3.Code
class Solution {
public int combinationSum4(int[] nums, int target) {
int[] dp = new int[target + 1];
dp[0] = 1;
Arrays.sort(nums);
DP(target , nums , dp);
return dp[target];
}
public void DP ( int target , int[] nums , int[] dp ) {
for ( int i = 1 ; i <= target ; i++ ) {
for ( int j = 0 ; j < nums.length ; j++ ) {
if ( i - nums[j] >= 0 ) {
dp[i] = dp[i] + dp[ i - nums[j] ];
} else {
break;
}
}
}
}
}
//预先对nums进行排序然后循环中加break,leetcode 提交从18.02%提升到65.16%
4.提交Leetcode的代码

Leetcode 之 Combination Sum系列的更多相关文章
- [Leetcode] Combination Sum 系列
Combination Sum 系列题解 题目来源:https://leetcode.com/problems/combination-sum/description/ Description Giv ...
- Java for LeetCode 216 Combination Sum III
Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
- [array] leetcode - 40. Combination Sum II - Medium
leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...
- [array] leetcode - 39. Combination Sum - Medium
leetcode - 39. Combination Sum - Medium descrition Given a set of candidate numbers (C) (without dup ...
- [leetcode]40. Combination Sum II组合之和之二
Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...
- [LeetCode] 40. Combination Sum II 组合之和 II
Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...
- [LeetCode] 216. Combination Sum III 组合之和 III
Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
- [LeetCode] 377. Combination Sum IV 组合之和 IV
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- 从Leetcode的Combination Sum系列谈起回溯法
在LeetCode上面有一组非常经典的题型--Combination Sum,从1到4.其实就是类似于给定一个数组和一个整数,然后求数组里面哪几个数的组合相加结果为给定的整数.在这个题型系列中,1.2 ...
随机推荐
- hdu 4771 Stealing Harry Potter's Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@' 表示的是起点,'#' 表示的是障碍物不能通过,'.' 表示的是路能通过的: ...
- js动态显示时间
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- c# 常用操作保留
RanDom如何提高生成随机数的随机性 一个在线考试系统的项目,需要从题库中随机抽取试题,但是如果直接 Random ran=new Randon(),ran.Next(nummin,nummax); ...
- Scala:fold,foldLeft和foldRight区别与联系 reduce
Scala:fold,foldLeft和foldRight区别与联系 我们来看看最后一个函数:reduce.使用reduce我们可以处理列表的每个元素并返回一个值.通过使用reduceLeft和red ...
- spring 的redis操作类RedisTemplate
spring 集成的redis操作几乎都在RedisTemplate内了. 已spring boot为例, 再properties属性文件内配置好 redis的参数 spring.redis.host ...
- Python 使用标准库根据进程名获取进程PID
应用场景 在进行 Linux 运维的环境中,我们经常会遇到维护同一台服务器上的多个程序,涉及到程序的启动.关闭和重启操作. 通常这些程序之间存在着相互依存的关系需要进行依次的启动关闭操作. 下面介绍几 ...
- react+echarts/g2/bizcharts可视化图表
一.echarts的折线图的使用demo如下,linecharts为实例化的封装组件,line为实际应用的组件 cnpm install echarts import React from 'reac ...
- python web框架 推荐
Flask 很轻,花很少的成本就能够开发一个简单的网站.非常适合初学者学习. 学会以后,可以考虑学习插件的使用,用 SQLAlchemy + Flask-SQLAlchemy 来对你的数据库进行控制. ...
- 酷狗缓存文件kgtemp的加密方式
[转自:http://www.cnblogs.com/KMBlog/p/6877752.html] 首先对比了一下缓存文件和下载好的mp3文件,发现缓存文件多了1024个字节,而且对比了几个缓存文件, ...
- (转)java 静态内部类
转自:http://blog.sina.com.cn/s/blog_605f5b4f0100zbps.html 参考:http://docs.oracle.com/javase/tutorial/ja ...