📅  最后修改于: 2023-12-03 14:49:53.854000             🧑  作者: Mango
在计算机科学中,回溯(backtracking)是一种通过探索所有可能的候选解来找出所有的解的算法。常常用于解决计算棘手问题,比如对未知数量的盘子进行塔汉诺式移动问题、或在井字棋或扫雷游戏中寻找所有的解。
其中一个应用就是找到拥有给定总和的最大大小子集。
def backtrack(nums, target):
nums = sorted(nums, reverse=True)
res = []
def dfs(start, path, cur_sum):
if cur_sum == target:
res.append(path[:])
return
for i in range(start, len(nums)):
if cur_sum + nums[i] > target:
continue
path.append(nums[i])
dfs(i+1, path, cur_sum+nums[i])
path.pop()
return
dfs(0, [], 0)
# 找到满足条件的路径中长度最大的一个
return max(res, default=[])
回溯的时间复杂度通常是指数级别的,最坏情况下,所有元素且不超过目标和的到集合中,递归中每个元素都有两个状态,即进入或不进入集合,因此时间复杂度是O(2^n)。
空间复杂度会随着递归的每一步而不断变化。在最坏情况下,存储所有可能的结果需要O(2^n)的空间。