排列-DFS和回溯-需要帮助来了解展开和回溯

时间:2019-02-19 19:14:02

标签: swift algorithm permutation depth-first-search backtracking

以下代码用于实现Ints数组的置换。对于这里的回溯方式,我无法全神贯注-特别是在打印[1, 2, 3]之后,如何返回并打印[1, 3, 2]-{{1}到底有多准确}工作?

path.removeLast()

1 个答案:

答案 0 :(得分:0)

有时,通过示例最容易了解回溯。取数组[1,2,3],然后使用您的方法执行以下操作:

Before removing: 1
Before removing: 1 2
Before removing: 1 2 3
After removing: 1 2
After removing: 1
Before removing: 1 3
Before removing: 1 3 2
After removing: 1 3
After removing: 1
After removing:
Before removing: 2
Before removing: 2 1
Before removing: 2 1 3
After removing: 2 1
After removing: 2
Before removing: 2 3
Before removing: 2 3 1
After removing: 2 3
After removing: 2
After removing:
Before removing: 3
Before removing: 3 1
Before removing: 3 1 2
After removing: 3 1
After removing: 3
Before removing: 3 2
Before removing: 3 2 1
After removing: 3 2
After removing: 3
After removing:

有效地,您正在做的是为每个排列生成所有可能的子序列,然后将其删除(因此最后删除),直到返回空白列表。如果为提供的代码绘制递归树,则将有31个节点(上面的每一行一个)。我们可以做得更好吗?是。对于相同的示例,请考虑以下树: enter image description here

(类似树的更佳版本,带有char而不是ints:Permutation of string using backtracking algorithm

很大的进步。树中只有10个节点,并且树中的最后一级具有所有排列。可以使用回溯来完成,这是一个更简单的示例。您要做的只是交换节点,而不是为每个排列生成所有可能的子序列。您可以在这里找到第二种更好方法的Swift实现:https://leetcode.com/problems/permutations/discuss/229627/Swift