leetcode 46 全排列(初识回溯)

杀马特。学长 韩版系。学妹 提交于 2020-02-08 02:07:13

回溯法的理解:
在这里插入图片描述
先从选择列表中进行选择,然后进行回溯(递归),之后撤销当前的选择。
回溯法主要包括以下两个变量:

  1. 选择列表
  2. 决策路径

回溯法的框架:

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return

    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

对于本题,除了应用回溯法进行查找,还要对选择过的元素进行标记,不再进行选择,避免重复。
其中,nums[:i] + nums[i+1:]就实现了从nums中删除已经选择的元素。
本题的代码:

class Solution:
    def permute(self, nums):

    	result = []
    	nums_length = len(nums)
    	
    	def backtrack(nums, answer = []):
    		if len(answer) == nums_length:
    			result.append(answer)

    		for i in range(len(nums)):

    			
    			backtrack(nums[:i] + nums[i+1:],answer + [nums[i]])

    	backtrack(nums,[])
    	return result

大佬的代码:
思路是一样的,就睡代码写法略有不同。

class Solution:
    # 应该可以用回溯法
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        # 定义保存最后结果的列表集合
        final_answer = []
        nums_length = len(nums)

        def back(answer=[]):
            # 如果临时结果集中的元素和给定数组nums长度相等,说明拿到了结果
            if len(answer) == nums_length:
                final_answer.append(answer)
                return
            for index in nums:
                if index not in answer:
                    back(answer+[index])
        back()
        return final_answer

参考链接:
https://zhuanlan.zhihu.com/p/53356027

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!