题目
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
自练代码
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
res = []
def backtrace(now, sum):
if sum == target:
tmp = now[:]
tmp = sorted(tmp)
res.append(tmp)
return
for i in candidates:
if sum + i <= target:
now.append(i)
backtrace(now, sum + i)
now.pop()
else:
continue
backtrace([], 0)
#print(res)
ans = set()
for i in res:
s = ''
for j in i:
s += str(j)
ans.add(s)
ans = list(ans)
#print(ans)
tmp = []
i, j = 0, 0
while(i != len(ans)):
j = 0
now_str = ans[i]
i += 1
now_list = []
now_int = ''
while(j != len(now_str)):
now_int += now_str[j]
if int(now_int) not in candidates:
j += 1
else:
now_list.append(int(now_int))
now_int = ''
j += 1
tmp.append(now_list)
return(tmp)
效率
执行用时:280 ms, 在所有 Python3 提交中击败了6.50%的用户
内存消耗:17.9 MB, 在所有 Python3 提交中击败了5.07%的用户
总结
如果样例出现candidates = [13,12,1,3,10], target = 13,此题将报错,偷了机取了个巧。