Combination 题目整理

Combination Sum

Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

The same repeated number may be chosen from C unlimited number of times.

Note:

  • All numbers (including target) will be positive integers.
  • The solution set must not contain duplicate combinations.

For example, given candidate set [2, 3, 6, 7] and target 7
A solution set is:

[
  [7],
  [2, 2, 3]
]

用for循环+ 递归的方式求解

  for 循环套在外层,表示遍历数组的第i个数字

  内层递归表示结果list里的第i个数字(比如第一层递归是寻找list里的第一个数字)

 1 public class Solution {
 2     public List<List<Integer>> combinationSum(int[] candidates, int target) {
 3         int size = candidates.length;
 4         List<List<Integer>> res = new ArrayList<List<Integer>>();
 5         List<Integer> list = new ArrayList<Integer>();
 6         helper (res, list, candidates, target, 0);
 7         return res;
 8     }
 9     private static void helper(List<List<Integer>> res,List<Integer> list, int[] candidates, int target, int pos) {
10         if (target == 0) {
11             res.add(new ArrayList<Integer>(list));
12             return;
13
14         }
15
16         if (target < 0) {
17             return;
18         }
19         int prev = -1;
20         for (int i = pos; i < candidates.length; i++) {
21             if(prev == candidates[i]) {
22                 continue;
23             }
24             list.add(candidates[i]);
25             helper(res, list, candidates, target - candidates[i], i);
26             prev = candidates[i];
27             list.remove(list.size() - 1);
28         }
29     }
30 }

combination

---------------我是分割线--------------------------------------

Combination Sum 2

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]
]

这个题目要注意下面的错误情况

用递归寻找第一个元素时,如果之前的结果里已经把1当作第一个元素,然后pop出去了,那么下次的1再想做为第一个元素的话就直接continue,这样就避免了2个[1,2,5]的情况,也就是说,在for循环里面不允许有相同的元素!只有第一次出现才做为valid

 1 public class Solution {
 2     public List<List<Integer>> combinationSum2(int[] candidates, int target) {
 3         int size = candidates.length;
 4         Arrays.sort(candidates);
 5         List<List<Integer>> res = new ArrayList<List<Integer>>();
 6         List<Integer> list = new ArrayList<Integer>();
 7         helper (res, list, candidates, target, 0);
 8         return res;
 9     }
10     private static void helper(List<List<Integer>> res,List<Integer> list, int[] candidates, int target, int pos) {
11         if (target == 0) {
12             res.add(new ArrayList<Integer>(list));
13             return;
14
15         }
16         if (target < 0) {
17             return;
18         }
19         int prev = -1;
20         for (int i = pos; i < candidates.length; i++) {
21             if (candidates[i] > target) {
22                 break;
23             }
24
25             if (prev != -1 && prev == candidates[i]) {
26                 continue;
27             }
28
29             if (candidates[i] != -1) {
30                 list.add(candidates[i]);
31                 helper(res, list, candidates, target - candidates[i], i + 1);
32                 prev = candidates[i];
33                 list.remove(list.size() - 1);
34             }
35         }
36     }
37 }

combinationSum2

---------------我是分割线--------------------------------------

Combination Sum 3

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]]

 1 public class Solution {
 2     public List<List<Integer>> combinationSum3(int k, int n) {
 3         List<List<Integer>> res = new ArrayList<List<Integer>>();
 4         List<Integer> list = new ArrayList<Integer>();
 5         helper (res, list, k, n, 1);
 6         return res;
 7     }
 8     private static void helper(List<List<Integer>> res,List<Integer> list, int k, int n, int current) {
 9         if (n == 0 && list.size() == k) {
10             res.add(new ArrayList<Integer>(list));
11             return;
12
13         }
14         if (list.size() == k || n < 0) {
15             return;
16         }
17
18
19         for (int i = current; i < 10; i++) {
20             list.add(i);
21             helper(res, list, k, n - i, i + 1);
22             list.remove(list.size() - 1);
23         }
24     }
25 }

combinationSum3

相当于[1,2,3,4,5,6,7,8,9] 的数组,然后增加了k的控制条件

---------------我是分割线--------------------------------------

Combination Sum IV

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.

Follow up:
What if negative numbers are allowed in the given array?
How does it change the problem?
What limitation we need to add to the question to allow negative numbers?

巨坑,只需要返回结果个数,那么其实是个动态规划的题目,类似于爬楼梯!!!

时间: 2024-10-13 17:33:56

Combination 题目整理的相关文章

数据库题目整理及详解(四)

前言 有多少次挥汗如雨,伤痛曾添满记忆,只因为始终相信,去拼搏才能胜利.总在鼓舞自己,要成功就得努力.热血在赛场沸腾,巨人在赛场升起. 相信自己,你将赢得胜利,创造奇迹:相信自己,梦想在你手中,这是你的天地.当一切过去,你们将是第一. 相信自己,你们将超越极限,超越自己! 相信自己,加油吧,健儿们,相信你自己. 坐在中体对面, 听着这振奋激昂的加油欢呼声, 照样可以感受到校运会的气势磅礴, 虽然我还在敲代码-- 来个这个吧, 特殊纪念, 沃夫慈悲: 说明 老生常谈! 接着之前的SQL语句继续整理

【Android进阶】Android面试题目整理与讲解

这一篇文章专门整理一下研究过的Android面试题,内容会随着学习不断的增加,如果答案有错误,希望大家可以指正 1.简述Activity的生命周期 当Activity开始启动的时候,首先调用onCreate(),onStart(),onResume()方法,此时Activity对用户来说,是可见的状态 当Activity从可见状态变为被Dialog遮挡的状态的时候,会调用onPause()方法,此时的Activity对用户可见,但是不能相 应用户的点击事件 当Activity从可见状态变为被其他

ACM 字符串 题目整理

AC自动机 UVa 11468  Substring AC自动机+概率DP. 注意要补全不存在的边. 为什么要补全不存在的边呢?补全以后可以直接找到状态的转移,即从所有子节点就可以实现所有状态转移. #include<iostream> #include<vector> #include<cmath> #include<map> #include<algorithm> #include<cstring> #include<cst

ACM 暴力搜索题 题目整理

UVa 129 Krypton Factor 注意输出格式,比较坑爹. 每次要进行处理去掉容易的串,统计困难串的个数. #include<iostream> #include<vector> #include<cmath> #include<map> #include<algorithm> #include<cstring> #include<cstdio> #include<cstdlib> #include

博弈论 题目整理

博弈论里面一个非常重要的结论: 如果前一个状态所有可能都是必败态,那么当前状态一定是必胜态. 如果前一个状态所有可能有一个是必胜态,那么当前状态一定是必败态. POJ 2484 A Funny Game 博弈游戏里面后手经常占据优势.除了A可以一次性全部拿光的情况,其他时候B都可以采取与A相同的策略,这样每次将石子分为相同的两组,最后获胜的一定是B. #include <cstdio> #include <cstring> #include <algorithm> us

【Android进阶】Android面试题目整理与讲解(二)

今天真机调试的时候莫名其妙遇到了这样的一个问题: This product type must be built using a provisioning profile, however no provisioning profile matching both the identity "iPhone Developer" and the bundle identifier..... 具体如下图所示: 十分蛋疼, 发现不管是从网上下的demo, 还是自己的过程.凡事真机测试的时候都

【Java基础】Java面试题目整理与解说(二)

1.Collection 和 Collections 的差别. Collection 是集合类的上级接口,继承于他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作. 2.HashMap 和 Hashtable 的差别. HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完毕了 Map 接口,HashMap是非线程安全,效率上可能高于 Hashtable.在多个线程

【Android进阶】Android面试题目整理与讲解(一)

这一篇文章专门整理一下研究过的Android面试题,内容会随着学习不断的增加,如果答案有错误,希望大家可以指正 1.简述Activity的生命周期 当Activity开始启动的时候,首先调用onCreate(),onStart(),onResume()方法,此时Activity对用户来说,是可见的状态 当Activity从可见状态变为被Dialog遮挡的状态的时候,会调用onPause()方法,此时的Activity对用户可见,但是不能相 应用户的点击事件 当Activity从可见状态变为被其他

Android面试题目整理与讲解(二)

1.Dalvik和标准Java虚拟机之间的主要差别? Dalvik和标准Java虚拟机(JVM)之间的首要差别之一,就是Dalvik基于寄存器,而JVM基于栈. Dalvik和Java之间的另外一大区别就是运行环境--Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik应用作为一个独立的Linux进程执行. (1)虚拟机很小,使用的空间也小: (2)Dalvik没有JIT编译器: (3)常量池已被修改为只使用32位的索引,以简化解释器: (4)它使用自己的字