我的问题涉及这个问题https://leetcode.com/problems/combination-sum-iii/discuss/和所有回溯问题。
我的问题是:为什么我的代码(与其他人的答案非常相似)总是比他们的代码更长?
def combinationSum3(self, k, n):
"""
:type k: int how many number
:type n: int how much add to
:rtype: List[List[int]]
"""
res=[]
self.backtrack(k, n, [], res)
newres=[]
for each in res:
newres.append(list(each))
return newres
def backtrack(self, k, n, path, res):
if len(path)> k or sum(path)>n:
return
if len(set(path))==k and sum(path)==n:
if set(path) not in res:
res.append(set(path))
return
for i in range(1, 10):
self.backtrack(k, n, path+[i], res)
其他人通过时限的代码:
# @param {integer} k
# @param {integer} n
# @return {integer[][]}
def combinationSum3(self, k, n):
if n > sum([i for i in range(1, 11)]):
return []
res = []
self.sum_help(k, n, 1, [], res)
return res
def sum_help(self, k, n, curr, arr, res):
if len(arr) == k:
if sum(arr) == n:
res.append(list(arr))
return
if len(arr) > k or curr > 9:
return
for i in range(curr, 10):
arr.append(i)
self.sum_help(k, n, i + 1, arr, res)
arr.pop()
答案 0 :(得分:0)
主要区别和减速是由于您的代码测试了比其他解决方案更多的组合。您生成所有数字组合,这会导致您多次测试“相同”组合,而另一个解决方案只生成每个可能的候选项一次,只允许序列中的下一个数字等于或大于前一个数字。 / p>
请看以下有限的候选人名单,其中数字范围限制在1至3之间:
1 1 1
1 1 2
1 1 3
1 2 1 <-
1 2 2
1 2 3
1 3 1 <-
1 3 2 <-
1 3 3
2 1 1 <-
2 1 2 <-
2 1 3 <-
2 2 1 <-
2 2 2
2 2 3
2 3 1 <-
2 3 2 <-
2 3 3
3 1 1 <-
3 1 2 <-
3 1 3 <-
3 2 1 <-
3 2 2 <-
3 2 3 <-
3 3 1 <-
3 3 2 <-
3 3 3
带有<-
的条目代表您测试的组合,这些组合是不必要的,未经其他程序测试。
此外,由于您生成了额外的候选人,您还需要在每个可能的解决方案上花费额外的时间,以确保它不在解决方案集中(以避免重复)。其他解决方案不需要这样,因为每个候选人都是唯一的。这个额外的测试也增加了你的运行时间,使其更糟糕。但是,要解决的主要问题是你测试的候选人数量!