LeetCode#39 Combination Sum

Problem Definition:

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, a1a2 ≤ … ≤ 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]

Solution:

回溯法(DFS)。每个元素可以被重复用很多次,因此DFS时子节点应当包括当前节点本身(或者说是再构造一个新的节点,包含了当前元素)。

另一个问题 Combination Sum,则不应该包括当前节点本身。

 1 # @param {integer[]} candidates
 2     # @param {integer} target
 3     # @return {integer[][]}
 4     def combinationSum(self, candidates, target):
 5         candidates.sort()
 6         res=[]
 7         self.cur(candidates, target, 0, [], res)
 8         return res
 9         
10     def cur(self, nums, target, index, localArr, res):
11         if target==0:
12             res.append(localArr[:])
13         else:
14             for i in range(index, len(nums)):
15                 nt=target-nums[i]
16                 if nt>=0:
17                     localArr.append(nums[i])
18                     self.cur(nums, nt, i, localArr, res)
19                     localArr.pop()
20                 else:
21                     break

 另外,在cur的for循环里,如果nt已经小于零,则不继续进行没必要的递归,也因为外围的 if-else 就不用处理target<0的情况了。

原文地址:https://www.cnblogs.com/acetseng/p/4702313.html