“回溯”算法总结(深度优先遍历 + 状态重置 + 剪枝)
地址:https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/ 首先解释“回溯”算法的应用,“回溯”算法主要用于搜索,因此有时候“回溯算法”也叫“回溯搜索”。这里“搜索”的意思即“查找我们所需要的解”。我们每天使用的“搜索引擎”就是帮助我们在庞大的互联网上搜索我们需要的信息。 而这里的“回溯”指的是“状态重置”,可以理解为“回到过去”、“恢复现场”,是在编码的过程中,为了节约空间而使用的一种技巧。 下面我们通过一个非常经典的问题,介绍“回溯”算法在查找问题的解中的应用。 这是「力扣」上第 46 号问题:“全排列”,这道题给我们一个没有重复数字的数组,要求我们返回其所有可能的全排列。 例如给出的数组是 [1, 2, 3] ,这个数组所有可能的全排列如下: [ [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1] ] 我们知道, N 个数字的全排列一共有 N ! N! N ! 这么多个。 大家可以尝试一下在纸上写 3 个数字、4 个数字、5 个数字的全排列,相信不难找到这样的方法。 例如数组 [1, 2, 3] 的全排列。 我们先写以 1 开头的全排列