问题描述:
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.
- Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
- 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]
原问题链接:https://leetcode.com/problems/combination-sum-ii/
问题分析
其实这个问题和前面那个问题差不多。我们同样可以用递归的方式来解决。在前面的问题里因为数组里的元素可以取多次,我们下一次的递归的时候可以继续从i这个点开始。而这里的话则必须从下一个开始。因此只是对上述问题的解法做一个很小的修改就可以适配这个问题了。
public class Solution { public List<List<Integer>> combinationSum2(int[] num, int target) { List<List<Integer>> ret = new LinkedList<List<Integer>>(); Arrays.sort(num); recurse(new ArrayList<Integer>(), target, num, 0, ret); return ret; } private void recurse(List<Integer> list, int target, int[] candidates, int index, List<List<Integer>> ret) { if (target == 0) { if(!ret.contains(list)) ret.add(list); return; } for(int i = index; i < candidates.length; i++) { int newTarget = target - candidates[i]; if(newTarget >= 0) { List<Integer> copy = new ArrayList<Integer>(list); copy.add(candidates[i]); recurse(copy, newTarget, candidates, i + 1, ret); } else break; } } }
上述代码其实就是一个深度优先遍历方法的一个实现。只是在一般的深度优先遍历,如果递归的过程是共用同一套数据结构的话需要将原来设置的值给恢复。而这里每次都是在下一个递归的时候拷贝一个新的数组,所以不需要这一步了。不过这种频繁的数组拷贝也使得程序执行的性能稍微慢了一些。我们也可以根据需要做一些修改。
相关推荐
java java_leetcode题解之Combination Sum II.java
java java_leetcode题解之Combination Sum.java
java java_leetcode题解之Combination Sum IV.java
java java_leetcode题解之Combination Sum III.java
leetcode打不开Leetcode Note Tips Tip1: Two pointer for sorted array (#Array 1. Two Sum) Tip2: Sum[i:j] = Sum[0:j] - Sum[0:i] for continuous array (# Array 560. Subarray Sum Equals K) Tip3: Knapsack ...
Leetcode\combination sum(39).swift Leetcode\count number of team(1395).swift Leetcode\counting bits(338).swift Leetcode \find 数组中的所有重复项(442).swift Leetcode\find peak element(162).swift ...
- 递归是解决回溯问题的关键,例如“N皇后”(N-Queens)和“组合总和”(Combination Sum)。C++的递归函数设计简洁,但需要注意堆栈溢出的问题。 - 动态规划如“背包问题”(Knapsack Problem)和“最长公共子...
leetcode怎么计算空间复杂度是指 LeetCode-Solution my first solution of LeetCode 2015-5-7 Problem 95,98(80 already!) 我经常在递归的结束地方忘记return!!! 题型一:经典暴力递归:(里面涉及到重复不重复的...
1. 回溯法:中等难度题目中,回溯法是一种常见的解决方案,如"Combination Sum"(组合总和)和"N-Queens"(皇后问题),通过回溯可以找到所有可能的解。 2. 动态规划:"House Robber"(打家劫舍)系列问题,展示了...
例如“组合总和”(Combination Sum)题目,通过回溯法找出所有可能的组合。 8. **动态规划**:解决最优化问题的利器,通过构建状态转移方程,避免重复计算。如“最长连续序列”(Longest Consecutive Sequence)...
如组合总和(Combination Sum)和字母异位词分组(Group Anagrams)就是通过回溯法求解的。 5. **字符串**:字符串处理题目考察了字符操作和模式匹配。比如,实现strStr()函数(Implement strStr())和有效的括号...
leetcode 530 力码 全部的: 易(173/237+x) 中(144/437+x) 硬(4/x) 问题 1.Two Sum(dict) 7.(跳过)(数学) 9.(跳过)(串串技巧) 11.盛水最多的容器 12.(跳过)(问题不好) 13.(跳过)(蛮力) 14.(跳过)...
c语言入门 C语言_leetcode题解之40-combination-sum-ii.c
js js_leetcode题解之40-combination-sum-II.js
回溯法在解决组合问题中十分常见,如"Combination Sum"问题,要求找出所有可能的数字组合,使得它们的和等于目标值。Python的函数式编程特性,如生成器和列表推导,可以使回溯算法的实现更加清晰和简洁。 此外,...
java入门 java_leetcode题解之039_Combination_Sum
c语言入门 C语言_leetcode题解之39-combination-sum.c
js js_leetcode题解之39-combination-sum.js