题目链接: . - 力扣(LeetCode)
每次做全排列的题目,我都要孕育好一阵子,到底怎么去思考这个问题呢?
首先,我觉得最好的方式就是画个树。
画了树之后,你就知道,这个问题,是一个循环遍历的问题,但是再遍历的过程中,你需要基于过去的状态(哪些元素被存储了),改变你之后的行为。
此外。我们还需要考虑终止条件,然后,这是一个回溯的问题,那么你需要考虑的就是回溯之后需要怎样的处理。
我们来一一回答这些问题
1. 如果保存过去的状态
我们可以通过一个mask,来记录哪些元素被传入了。
2. 如何设定终止条件
我们可以判断list的长度,如果list的长度和原数组一致,我们就可以保存。
3. backtrack之后的状态重置
我们需要重置两个状态,一个是path中的元素,另一个是遍历到的元素的判断。
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
path = []
result = []
def backtrack(nums, used):
if(len(path) == len(nums)):
result.append(path[:])
return
for i,ele in enumerate(nums):
if(used[i] == False):
path.append(ele)
used[i] = True
backtrack(nums,used)
path.pop()
used[i] = False
return result
used = [False] * len(nums)
result = backtrack(nums, used)
return result