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.
- 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] ]
Subscribe to see which companies asked this question
import copy
class Solution(object):
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
tree = []
result = set()
candidates_len = len(candidates)
candidates.sort()
while(sum(tree) < target):
tree.append(candidates[0])
while(True):
if sum(tree) == target:
#print tree
result.add(tuple(sorted(copy.deepcopy(tree))))
#print result
pos = candidates_len
flag = True
while pos == candidates_len:
del tree[-1]
if len(tree) == 0:
flag = False
break
pos = candidates.index(tree[-1]) + 1
if not flag:
break
tree[-1] = candidates[candidates.index(tree[-1])+1]
elif sum(tree) > target:
pos = candidates_len
flag = True
while pos == candidates_len:
del tree[-1]
if len(tree) == 0:
flag = False
break
pos = candidates.index(tree[-1]) + 1
if not flag:
break
tree[-1] = candidates[candidates.index(tree[-1])+1]
else:
while(sum(tree) < target):
tree.append(candidates[0])
pos = candidates.index(tree[-1]) + 1
flag = True
while pos == candidates_len:
del tree[-1]
if len(tree) == 0:
flag = False
break
pos = candidates.index(tree[-1]) + 1
if not flag:
break
tree[-1] = candidates[candidates.index(tree[-1])+1]
result = list(result)
for i in range(len(result)):
result[i] = list(result[i])
return result