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的每个元素仅允许被使用一次

  1. backTracing(current,i + 1 ,target - temp[i]); 位置变为 i + 1
  2. 处理结果中存在的重复问题
  3. 输出的结果跟顺序无关,即([[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系列的更多相关文章

  1. [Leetcode] Combination Sum 系列

    Combination Sum 系列题解 题目来源:https://leetcode.com/problems/combination-sum/description/ Description Giv ...

  2. 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 ...

  3. [array] leetcode - 40. Combination Sum II - Medium

    leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...

  4. [array] leetcode - 39. Combination Sum - Medium

    leetcode - 39. Combination Sum - Medium descrition Given a set of candidate numbers (C) (without dup ...

  5. [leetcode]40. Combination Sum II组合之和之二

    Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...

  6. [LeetCode] 40. Combination Sum II 组合之和 II

    Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...

  7. [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 ...

  8. [LeetCode] 377. Combination Sum IV 组合之和 IV

    Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...

  9. 从Leetcode的Combination Sum系列谈起回溯法

    在LeetCode上面有一组非常经典的题型--Combination Sum,从1到4.其实就是类似于给定一个数组和一个整数,然后求数组里面哪几个数的组合相加结果为给定的整数.在这个题型系列中,1.2 ...

随机推荐

  1. hdu 1018 Big Number 数学结论

    Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  2. 1年3年5年-我对PHP攻城师有看法

    今天早上公车上看微信拉勾的一些岗位推送,挑了几个PHP攻城师看看 15K-20K的 百万级网站架构经验 3年以上开发,至少1年互联网用户产品开团队开发经验 不低于百度T4水平 数据库规划和优化,熟悉常 ...

  3. Prerender Application Level Middleware - ASP.NET HttpModule

    In the previous post Use Prerender to improve AngularJS SEO, I have explained different solutions at ...

  4. JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术

    JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术.从这一点来看,非常类似Microsoft ASP.PHP等技术.借助形式上的内容和外观表现的分 ...

  5. 消息队列ipc的一些设置

    Linux IPC 参数设定- 命令方式: echo 80 > /proc/sys/vm/overcommit_ratio, etc MSGMNB 每个消息队列的最大字节限制. MSGMNI 整 ...

  6. petrozavodsk summer 2018 游记&&总结

    day0: 出发前训了一场比较水bapc2017保持手感(恢复信心),成功AK了,不过罚时略高.然后三人打车从紫金港到杭州东站,坐高铁到上海虹桥,再坐机场快线到浦东机场(傻乎乎的jsb帮爸爸付了钱,然 ...

  7. 【tyvj】P2065 「Poetize10」封印一击(贪心+线段树/差分)

    http://new.tyvj.cn/p/2065 我就不说我很sb的用线段树来维护值...... 本机自测的时候想了老半天没想出怎么维护点在所有区间被多少区间包含的方法.最后一小时才想出来线段树(果 ...

  8. MySQL中的日期和时间函数

    常用日期函数如下: 函   数 功   能 CURDATE() 获取当前日期 CURTIME() 获取当前时间 NOW() 获取当前的日期和时间 UNIX_TIMESTAMP(date) 获取日期的U ...

  9. MATLAB使用fft求取给定音频信号的频率

    一段10s立体声音频,采样率位8000Hz,已知频率为1000Hz clc; clear; [data, Fs] = audioread('1khz_stereo_8000.wav'); fs=Fs; ...

  10. CSS-微信开放UI样式

    下面的链接是微信开放的CSS的样式: http://weui.github.io/weui/ 附上GitHub地址:https://github.com/weui/weui