本文主要是介绍再谈全排列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接: . - 力扣(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
这篇关于再谈全排列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!