[Lintcode] #135 数字组合
2017-11-07 23:57
260 查看
给出一组候选数字(C)和目标数字(T),找到C中所有的组合,使找出的数字和为T。C中的数字可以无限制重复被选取。
例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为:
[7],
[2,2,3]
注意事项
所有的数字(包括目标数字)均为正整数。
元素组合(a1, a2,
… , ak)必须是非降序(ie, a1 ≤ a2 ≤
… ≤ ak)。
解集不能包含重复的组合。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出候选数组[2,3,6,7]和目标数字7
返回 [[7],[2,2,3]]
例如,给出候选数组[2,3,6,7]和目标数字7,所求的解为:
[7],
[2,2,3]
注意事项
所有的数字(包括目标数字)均为正整数。
元素组合(a1, a2,
… , ak)必须是非降序(ie, a1 ≤ a2 ≤
… ≤ ak)。
解集不能包含重复的组合。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出候选数组[2,3,6,7]和目标数字7
返回 [[7],[2,2,3]]
public class Solution { /* * @param candidates: A list of integers * @param target: An integer * @return: A list of lists of integers */ public List<List<Integer>> combinationSum(int[] candidates, int target) { Arrays.sort(candidates); List<List<Integer>> data = new ArrayList<>(); helper(data, new ArrayList<Integer>(), 0, 0, target, candidates); return data; } public void helper(List<List<Integer>> data, List<Integer> cur, int depth, int sum, int target, int[] nums) { if (sum == target) { data.add(new ArrayList<>(cur)); return; } else if (sum > target) return; for (int i = depth; i < nums.length; ++i) { if (i > 0 && nums[i] == nums[i - 1]) continue; cur.add(nums[i]); helper(data, cur, i, sum + nums[i], target, nums); cur.remove(cur.size() - 1); } } }
相关文章推荐
- lintcode-135-数字组合
- LintCode:数字组合
- LintCode 135-数字组合 回溯法
- 数字组合-LintCode
- Combination Sum (lintcode 135)
- lintcode-数字组合-135
- lintcode-153-数字组合 II
- LintCode 数字组合 题解
- LintCode 30:Insert Interval
- 上一个排列-lintcode
- LintCode 最多有多少个点在一条直线上
- LintCode 22 平面列表
- LintCode 395: First Will Win 2
- 蓝桥杯 ADV-135 算法提高 三角形面积
- LintCode 字符串查找
- LintCode 用递归打印数字
- 删除排序链表中的重复元素-LintCode
- LintCode 生成括号
- lintcode——链表插入排序
- Lintcode 主元素 II