Leetcode题目46.全排列(回溯+深度优先遍历+状态重置-中等)
题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 题目解析:来自leetcode@ liweiwei1419 以示例输入: [1, 2, 3] 为例,如果让我们手写,要做到不重不漏,我们书写的策略可能是这样:“一位一位确定”,这样说比较笼统,具体是这样的: 1、先写以 1 开始的两个排列:[1, 2, 3]、[1, 3, 2]; 2、再写以 2 开始的两个排列:[2, 1, 3]、[2, 3, 1]; 3、最后写以 3 开始的两个排列:[3, 1, 2]、[3, 2, 1]。 如果数组元素多一点的话,也不怕,我们写的时候遵循下面的原则即可: 1、按数组的顺序来(不要求排序,但我们选取元素的顺序是从左到右的),每次排定 1 个元素; 说明:只有按照顺序才能做到不重不漏。 2、新排定的元素一定不能在之前排定的元素中出现。 说明:如果违反了这一条,就不符合“全排列”的定义。 其实让程序帮你找到所有的全排列也是这样的思路。如果不是这样的话,我们要写数组长度这么多层的循环,编码极其困难,代码写出来也非常不好看。 这道题可以作为理解“回溯算法”的入门题。这是一个非常典型的使用 回溯算法 解决的问题。解决回溯问题,我的经验是