题目链接: . - 力扣(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[:])returnfor i,ele in enumerate(nums):if(used[i] == False):path.append(ele)used[i] = True backtrack(nums,used)path.pop()used[i] = Falsereturn result used = [False] * len(nums)result = backtrack(nums, used)return result