leetcode 46 全排列(初识回溯)

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

  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

发布了100 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/cy_believ/article/details/104214911
今日推荐