46. 全排列
用回溯 + DFS 查找全排列
题目链接-来源:力扣(LeetCode)
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
思路:
全排列的问题很直观,对于 nums 数组中的数字,我们可以用一个布尔型数组 visited[]将其标记为两类,一类是已经取到我们的结果集中的元素,另一类是尚未选择的元素。我们每次递归中,就按照一定的顺序(如,从后往前,或者从前往后,保证不遗漏即可),搜索 nums 中的尚未选择的元素,将其标为已选择(visited[i] 标记为 true),加入结果集,并在此基础上继续进行更深一层的 dfs。
回溯发生在深层 dfs 返回之后,我们要恢复现场,将相关变量恢复为好像没有发生过本次 dfs 一样,包括从结果集中删除选择的元素(对于本题,即为结果列表最后一个元素),修改 visited[i]。
递归中止的条件为结果集大小恰为 nums 的长度,表示我们已经得到了一组符合要求的结果,我们将其复制一份插入待返回的列表中,并跳出当前递归。
时间复杂度:O(n * n!)
空间复杂度:O(n)
实现:
1 | class Solution { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.