题目:
Given a set of candidate numbers (C) (without duplicates) 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] ]
思考:
这一题一眼看上去比较简单,使用BFS或者DFS应该都可以做出来,初步尝试之后发现很多问题:1、如果单纯地使用BFS或者DFS,会导致“重复”的结果,如例题中就会出现[2,2,3]和[3,2,2]这样的结果。2、使用BFS会导致检索速度很慢,容易超时。
因此结合之前的教训,构造这棵树的时候,每一层不能有重复的检索,单个节点之后的子节点,只能是在这个节点的值之后的值,如[2,3,6,7]这样的数组,3这个节点的子节点,只能是[3,6,7],这样就可以避免了出现不同顺序的重复结果了。其次,我们先对原数组进行排序,再使用DFS,这样当检索到如果子节点的和大于target,便不需要再向下扩展,如果set的数据较多,使用BFS会减慢速度。
代码:
class Solution(object):
def combinationSum(self, candidates, target):
candidates.sort()
result = []
state = []
for i in range(len(candidates)):
state.append([candidates[i:],[candidates[i]]])
while len(state) > 0:
s = state.pop()
if sum(s[1]) == target:
result.append(s[1])
elif sum(s[1]) < target and len(s[0]) > 0:
for i in range(len(s[0])):
state.append([s[0][i:],s[1]+[s[0][i]]])
return result
结果: