做 csdn 算法题进行学习,这一题是回溯算法:一种优先搜索算法(试探法);按优条件向前搜索,以达目标;当试探到某步,发现原来选择并不好(走不通),就退回重新选择。
class Solution(object):
def combinationSum2(self,candidates,target):
candidates.sort()
dp = [[] for _ in range( target + 1)]
dp[0].append([])
for i in range (1,target + 1):
for j in range(len(candidates)):
if candidates[j] > i:
break
for k in range(len(dp[i - candidates[j]])):
temp = dp[i - candidates[j]][k][:]
if len(temp)>0 and temp[-1] >= j:
continue
temp.append(j)
dp[i].append(temp)
res = []
check = {}
for temp in dp[target]:
value = [candidates[t] for t in temp]
try:
check[str(value)] += 1
except KeyError:
check[str(value)] = 1
res.append(value)
return res
# %%
s = Solution()
print(s.combinationSum2(candidates=[2,5,2,1,2],target=5))
python中sort () 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。
dp = [[] for _ in range( target + 1)]新建列表for _ in range(n) 一般仅仅用于循环n次,不用设置变量,用 _ 指代临时变量,只在这个语句中使用一次
res = []存放组合结果
通过遍历两个列表与字典的增删改查操作达到目的
try except (异常捕获)
当程序出错了,但是我们又不想让用户看到这个错误,而且我在写程序的时候已经预料到了它可以出现这样的错误,出现这样的错误代表着什么,我们可以提前捕获这些个错误
# %%运行单元并且调试?
|