深度遍历
以我的理解,就是一条道走到黑,如果发现是死路,那么退回一步,再走另一条,就这样,走完全部路。
刚开始接触到这个话题是在二叉树的时候,需要遍历:
def depth_tree(root):
if root is not None:
print root.val
if not root.left:
return depth_tree(root.left)
if not root.right:
return depth_tree(root.right)
但是呢,二叉树很容易理解,如果扩展到其他地方呢?深度遍历的思想又是什么呢?
先来看 lettcode 的一道题:
Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[
[7],
[2,2,3]
]
输出数组中有哪些数字加起来可以得到 target,允许重复。
def combinationSum(candidates, target):
result = []
candidates = sorted(candidates)
def dfs(remain, stack):
if remain == 0:
result.append(stack)
return
for item in candidates:
if item > remain:
break
if stack and item < stack[-1]:
continue
else:
dfs(remain - item, stack+ [item])
dfs(target, [])
return result
def main():
candidates = [2,3,6,7]
target = 7
print(combinationSum(candidates, target))
if __name__ == '__main__':
main()
首先一条道,先把第一个值累加起来,看能不能构成 target,不行的话就少一个,再遍历。