ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

回溯法 leetcode78 77 46

2022-03-02 00:02:06  阅读:180  来源: 互联网

标签:subset nums 46 res leetcode78 List len 77 backtracking


回溯法

points:
1 是一个不断试错的算法
2 采用递归思想 在进入下一层后 会进行一次回溯(将该层更改的复原 方便进行别的方向的试错)

经典例题 78

看到题目如何想到回溯:
题目要求返回输入的所有子集
point1:返回子集长度分别是0,1…,len(nums) 每次运行都将层次+1
point2: 回溯的思想 在长度确定的情况下 添加元素 之后要下个层次添加元素 将上个层次添加的元素删除
point3: 递归返回空值 不返回任何元素
point4:不允许重复,直接向后遍历即可

代码:

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        def backtracking(nums,res,index,subset,length):
            if len(subset) == length:
                res.append(subset[:])
                return   #point3 返回空值
            for i in range(index,len(nums)):
                subset.append(nums[i])
                backtracking(nums,res,i+1,subset,length)#point4 向后遍历
                subset.pop() #point2 删除上次添加的元素 进入下个层次
        res = []
        for i in range(len(nums)+1): #point1 层次+1
            backtracking(nums,res,0,[],i)
        return res

经典例题77

题目要求返回整数[1,n]数内 长度为k的任意组合
point1:设置一个数组之后由于题目要求不能重复,即简单的向后遍历,删除,再遍历,经典的回溯过程。
point2:设置往后遍历的层次

代码

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        def backtracking(nums,res,subset,k,index):
            if len(subset) == k:
                res.append(subset[:])
                return  
            for i in range(index,len(nums)):
                subset.append(nums[i])
                backtracking(nums,res,subset,k,i+1)#point1 point2
                subset.pop()#point1中的回溯 删除元素
        nums = [i for i in range(1,n+1)]
        res = []
        backtracking(nums,res,[],k,0)
        return res

经典例题46

全排列
题目要求返回给定数组的所有排列方式,可以像画树一样一个一个画下来,在使用过的数字上打上使用过的标记,挨个往里添加元素,如图所示,确定了一个元素之后往下遍历直至递归终止条件开始回溯
在这里插入图片描述

代码

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        def backtracking(nums,res,used,temp):
            if len(temp) == len(nums):
                res.append(temp[:])
                return 
            for i in range(len(nums)):
                if used[i]:
                    used[i] = False
                    temp.append(nums[i])
                    backtracking(nums,res,used,temp)
                    temp.pop()
                    used[i] = True
        res = []
        used = [True for i in range(len(nums))]
        backtracking(nums,res,used,[])
        return res

标签:subset,nums,46,res,leetcode78,List,len,77,backtracking
来源: https://blog.csdn.net/nendie1/article/details/123211950

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有