LeetCode-algorithms 39. Combination Sum

题目:

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

结果:



tim
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值