码迷,mamicode.com
首页 > 其他好文 > 详细

Combination 题目整理

时间:2016-10-04 09:52:29      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

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?

 

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

 

Combination 题目整理

标签:

原文地址:http://www.cnblogs.com/jiangchen/p/5930049.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!