题目描述
题目链接:力扣(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] ]
解题思路:深度优先 回溯
本题是一个经典的回溯算法问题,我们可以通过递归的方式来实现。下面是具体的实现思路:
- 定义一个列表
res
,用于保存所有的排列组合。 - 定义一个列表
element
,用于保存当前正在处理的排列。 - 定义一个函数
backtrace()
,用于实现递归回溯的过程。该函数的参数包括:数组nums
,数组的大小size
,当前处理的深度depth
,当前的排列element
,标记数组used
和结果列表res
。 - 在
backtrace()
函数中,首先判断当前排列的深度是否等于数组的大小。如果是,说明已经生成了一个排列,将其添加到结果列表中。 - 如果当前排列的深度小于数组的大小,则需要继续生成排列。遍历数组
nums
中所有未被使用的元素,将其添加到当前排列element
中,并在标记数组used
中将该元素标记为已使用。然后递归调用backtrace()
函数,深度depth+1
,继续生成排列。 - 在递归调用完成后,需要恢复标记数组
used
和当前排列element
的状态,以便下一次迭代能够正确进行。
最终,当递归返回到最初调用的位置时,所有的排列组合都会保存在结果列表 res
中,我们只需要将其返回即可。
python代码实现
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = []
element = []
def backtrace(nums, size, depth, element, used, res):
if depth == size:
res.append(element[:])
return
else:
for i in range(size):
if used[i] == False:
used[i] = True
element.append(nums[i])
backtrace(nums, size, depth+1, element, used, res)
used[i] = False
element.pop()
size = len(nums)
depth = 0
used = [False for _ in range(size)]
backtrace(nums, size, depth, element, used, res)
return res
总结
本题是一个经典的回溯算法问题,对于初学者来说比较有难度。但是,只要熟悉了回溯算法的基本思想,就可以轻松解决本题以及其他类似问题。回溯算法虽然看上去比较简单,但是要注意在递归调用时正确处理状态的回溯,避免出现意外的结果