美文网首页
2.算法-递归和回溯

2.算法-递归和回溯

作者: 做一只有趣的芦苇 | 来源:发表于2020-11-07 21:29 被阅读0次

回溯经典例题

https://zhuanlan.zhihu.com/p/112926891

39. 组合总和

def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        def backtrack(lst,target,res,path,begin,size):
            #step1:不满足条件直接返回
            if target<0: return 
            #step2:满足条件返回结果(执行一些操作)
            if target==0:
                res.append(path)
                return
            #step3:循环遍历所有的可能性
            for index in range(begin,size):
                backtrack(lst,target-lst[index],res,path+[lst[index]],index,size)
        size=len(candidates)
        if not size: return []
        res,path=[],[]
        backtrack(candidates,target,res,path,0,size)
        return res

140. 单词拆分 II

def wordBreak(self, s: str, wordDict: List[str]) -> List[str]:
        import functools
        if not wordDict:return []
        wordDict = set(wordDict) #set 内部是dict实现 in操作时间复杂度O(1)
        max_len = max(map(len, wordDict)) # 高级写法
        @functools.lru_cache(None)
        def backtrack(s):
            res = []
            if not s:
                res.append("")
                return res
            for i in range(len(s)):
                if i < max_len and s[:i+1] in wordDict: 
                    for t in backtrack(s[i+1:]):
                        if not t:
                            res.append(s[:i+1])
                        else:
                            res.append(s[:i+1] + " " + t) #最后回溯的放在后面
            return res    
        return backtrack(s)

14. 自由之路

def findRotateSteps(self, ring: str, key: str) -> int:
        @lru_cache(None)
        def dfs(path,s):
            # 如果递归深度和key长度相同,递归结束
            if path == len(key):
                return 0

            left = s.find(key[path])
            left_str = s[left:]+s[:left]
            
            right = s.rfind(key[path])
            right_str = s[right:]+s[:right]

            left_res = dfs(path+1,left_str)
            right_res =  dfs(path+1,right_str)

            res = min(left+left_res,len(s)-right+right_res)+1
            return res
            
        return dfs(0,ring)

4. 17. 电话号码的字母组合

def letterCombinations(self, digits: str) -> List[str]:
        # 回溯 时间复杂度 3**a * 4**b  a,b表示字符串中对应字典值长度为3和4的数字个数
        if not digits: return []
        a = '23456789'
        b = ['abc','def','ghi','jkl','nmo','pqrs','tuv','wxyz']
        dic = dict(zip(a,b)) # 创建字典
        res,state = [],[] # 结果集/中间状态集
        def backtrack(idx):
            if idx == len(digits): 
                res.append("".join(state))
            else:
                num = digits[idx]
                for c in dic[num]:
                    state.append(c) # 更新状态
                    backtrack(idx+1) # 每次加入新字母后递归下一个位置
                    state.pop() # 清空状态
        backtrack(0)
        return res

相关文章

  • 2.算法-递归和回溯

    回溯经典例题 https://zhuanlan.zhihu.com/p/112926891[https://zhu...

  • 8.30 leetcode刷题(2)

    递归和回溯:17 电话号码 思路:运用递归去实现回溯算法的思想。回溯算法本质上是一种暴力搜索,通过递归调用去实现,...

  • 二叉树算法之0-计算二叉树的深度

    算法思想:使用递归 算法解析:分别递归左树和右树,递归到叶子节点时返回0,递归回溯时值+1,不断累积回溯的深度,每...

  • 递归、迭代、回溯、广度和深度优先

    在学习算法的时候,经常碰到递归、迭代、回溯、广度优先和深度优先算法,可是回溯使用了递归,深度优先也使用了递归,广度...

  • 递归2-回溯与递归

    I. 回溯算法基础 回溯与递归的区别和联系  很多人不理解回溯与递归到底是什么关系。其实很简单,回溯算法是一种算法...

  • 回溯算法,Leetcode 46和Leetcode 980

    什么是回溯算法,以及什么时候会用到 回溯算法和递归有关系。它是利用递归来寻找一个问题的所有解,例如一个数组的排列组...

  • 回溯递归算法

    回溯大法严重依赖【递归】 1、求子集 78. 子集[https://leetcode-cn.com/problem...

  • 12.矩阵路径

    思路: 使用回溯算法 回溯算法的实现方式是利用递归 可以借助画树形图来分析所需要的变量和条件 具体细节: 定义好终...

  • 数据结构与算法简述(下)

    目录: 算法简介 排序算法 递归与穷举 贪心与分治 动态规划和回溯 1.算法简介 解题方案的准确而完整的描述,是一...

  • 算法学习(递归和回溯)

    回溯法 LeetCode 17 电话的字母组合,方法:回溯算法 LeetCode 93 复原IP地址(练习)完...

网友评论

      本文标题:2.算法-递归和回溯

      本文链接:https://www.haomeiwen.com/subject/guvyvktx.html