首页 > 代码库 > 【LeetCode】Combination Sum
【LeetCode】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.
- 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 2,3,6,7
and target 7
,
A solution set is: [7]
[2, 2, 3]
这个题目跟第二道题目唯一的区别是重开开始递归下层的位置,不是从i+1开始,而是从i开始,这样就满足了一个元素可以出现无限次的条件。
public class Solution { public ArrayList<ArrayList<Integer>> combinationSum(int[] num, int target) { if(num.length==0) return re; ArrayList<Integer> al = new ArrayList<Integer>(); Arrays.sort(num); FindPath(num,al,target,0,num.length-1); re.addAll(remap.keySet()); return re; } public Map<ArrayList<Integer>,Integer> remap = new HashMap<ArrayList<Integer>,Integer>(); public ArrayList<ArrayList<Integer>> re = new ArrayList<ArrayList<Integer>>(); private void FindPath(int[] num, ArrayList<Integer> al, int target, int start, int end) { if(start>end) return; for(int i=start;i<=end;i++){ al.add(num[i]); int temp = sum(al); if(temp==target){ ArrayList<Integer> at = new ArrayList<Integer>(); for(int j=0;j<al.size();j++){ at.add(al.get(j)); } remap.put(at, 1); al.remove(al.size()-1); return; } if(temp<target){ FindPath(num,al,target,i,end); al.remove(al.size()-1); }else{ al.remove(al.size()-1); return; } } } private int sum(ArrayList<Integer> al) { int re=0; for(int i=0;i<al.size();i++){ re+=al.get(i); } return re; } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。