您的位置:首页 > 其它

LeetCode 41: Combination Sum

2013-04-10 12:58 435 查看
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]


LL's solution:

DFS

public class Solution {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
public void DFS(int[] candidates,ArrayList<Integer> current,int index,int target){
if(target<0 || index>candidates.length-1)
return;
else if(target==0)
res.add(current);
else{
// left branch, not add the node
DFS(candidates,new ArrayList<Integer>(current),index+1,target);
// right branch, add the node as many as possible
int node = candidates[index];
while(target-node>=0){
current.add(node);
target = target-node;
DFS(candidates,new ArrayList<Integer>(current),index,target);
}
}
return;
}
public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {
// Start typing your Java solution below
// DO NOT write main() function
int len = candidates.length;
if(len<1)
return res;
res.clear();
Arrays.sort(candidates);
ArrayList<Integer> current = new ArrayList<Integer>();
DFS(candidates,current,0,target);
HashSet st = new HashSet();
st.addAll(res);
res.clear();
res.addAll(st);
return res;
}
}
Note:

1. DFS做出来res会有重复,因为相同的结果是从不同的路径走出来的,最后要去重(用HashSet)。

2. 要求res里面要从小到大sorted,需保证两点:1. candidate是soted,2. 顺序遍历candidate

若要求从大到小sorted,则只需更改以下几行:

4 if(target<0 || index>candidates.length-1) -> if(target<0 || index<0)

10 DFS(candidates,new ArrayList<Integer>(current),index+1,target); -> index-1

30 DFS(candidates,current,0,target) -> DFS(candidates,current,len-1,target)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: