codetop打卡第二日

154 阅读1分钟

🍓今天来打卡codetop第二天,今天主要是来解决回溯的经典问题,比如全排列。🍓\color{#fbbc05}{今天来打卡codetop第二天,今天主要是来解决回溯的经典问题,比如全排列。}

🐬话不多说,让我们开始今天的学习。🐬\color{#4285f4}{话不多说,让我们开始今天的学习。}

1. 题目描述

leetcode46:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 image.png

分析:这是最典型的回溯问题,我们需要一步一步去选择对应位置的元素,然后撤销选择,接着选择下一个元素,直到所有的元素都被选择了一遍。

解题方法:

def permute(self, nums: List[int]) -> List[List[int]]:

    n=len(nums)#数组长度

    res=[]#存储结果

    def backtrack(first=0):#回溯函数

    if first==n:#判断长度是否已经是数组长度n,如果是,就说明遍历完成

        res.append(nums[:])

    for i in range(first,n):#回溯的过程

        nums[i],nums[first]=nums[first],nums[i]#这是一个选择的过程

        backtrack(first+1)#回溯

        nums[i],nums[first]=nums[first],nums[i]#撤销选择
    backtrack()
    return res#返回结果

结果如下:

image.png

2. 拓展

回溯法解题是有模版的,主要是采用试错的思想,第一步我们随机选择一个变量,看看是否正确,如果不正确,就撤销选择,重选择别的变量。主要有以下3步:

  1. 选择路径,目前,我选择了哪些路径
  2. 剩余路径,你还有哪些路径没选过
  3. 结束条件,什么时候结束选择

根据这道题,我们总结出回溯的模版。

res = []
backtrack(路径,选择列表)
  if 满足结束条件:
    res.append(路径)
    return
  for 选择 in 选择列表:
    做选择
    backtrack(路径,选择列表)
    撤销选择