回溯法

回朔法的思想: 通过枚举法,对所有可能性进行遍历。 但是和枚举法不同的是回溯法不是一直遍历下去,而是在不满足条件是回退一步,去尝试其余的路,而回退的这一步就是回溯算法的关键。
因此回朔法可以简单的理解为: 走不通就退一步的枚举法。而这里回退点也叫做回朔点。
利用for循环和递归配合可以实现回朔: 当递归从递归出口出来之后,上一层的for循环就会继续执行,而for循环的继续执行就会给出当前节点下的下一条可行路径。然后再递归调用,就可以顺着这条从未走过的路径又向下走一步。
回溯模板 python

def dfs():if 回朔点:# 递归出口,这条路走到底了保存当前结果return  for route in all_route_set :  # 逐步选择当前节点下的所有可能routeif 剪枝条件:剪枝前的操作return   # 不继续往下走了,退回上层,换个路走# 当前路径可能是条可行路径保存当前数据  # 向下走之前要记住已经走过这个节点了。例如push当前节点dfs() # 递归调用,继续向下走一步回朔清理     # 该节点下的所有路径都走完了,清理堆栈,准备下一个递归。例如pop当前节点

例题1 (力扣 39. 组合总和):
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。

class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:if len(candidates) == 0: return []candidates = sorted(candidates)  # 排序# 回溯法# candisates: 候选点列表, target:目标,begin:起始位置,path:当前走过的路径,res:结果列表def dfs(candidates, target, begin, path, res):path = path.copy()  # python 传的参数是引用,所以重新复制一份if target == 0: # 回溯点, 到达目标,该退出了res.append(path) # 保存当前结果return # 返回for i in range(begin, len(candidates)): # 从当前点的候选点中按顺序依次选取一个点进行回溯if target - candidates[i] < 0: # 如果此时已不可能在满足题意,则剪枝,返回return path.append(candidates[i]) # 回溯之前,记录当前点dfs(candidates, target-candidates[i], i, path, res) # 回溯# 注:此题数据可重复,所以回溯起点是i,否则为i+1path.pop() # 回溯清理,弹出当前点res = []dfs(candidates, target, 0, [], res)  # 回溯return res

20.9.18 补充一道题目 (全排列问题)

[力扣] 47. 全排列 II 。给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:
输入: [1,1,2]
输出:
[[1,1,2],[1,2,1],[2,1,1]
]

这是一道很经典的回溯题,采用回溯加上剪枝,可以达到很高的效率。

执行用时:40 ms, 在所有 Python3 提交中击败了98.20%的用户
内存消耗:13.3 MB, 在所有 Python3 提交中击败了97.76%的用户

思路: 从给定列表中每次取一个值,添加到path中,然后再从剩下的值中取一个,直到达到回溯条件(path长度等于nums长度),然后回溯。
在这道题中剪枝那一步是必要的,可以排除重复结果。

class Solution:def permuteUnique(self, nums: List[int]) -> List[List[int]]:n = len(nums)if n==0: return []  # 空列表直接返回nums.sort() # 排序def dfs(nums, path, res):if len(path) == n:  # 回溯点res.append(path[:])  # 添加到结果中,注意path和path[:]的群IEreturnfor i in range(0, len(nums)): if i>0 and nums[i]==nums[i-1]: # 剪枝,和上一次取值一样会造成重复,所以舍弃,重新取值continuepath.append(nums[i]) # 添加点dfs(nums[:i]+nums[i+1:], path, res) # 下一次选取值得nums是这一次旋球之后剩下的,也就是从nums中排除掉nums[i]path.pop() # 回溯一步,弹出一个点res = []dfs(nums, [], res)return res

[LeetCode] 回溯算法相关推荐

  1. 八十四、Python | Leetcode回溯算法系列

    @Author:Runsen @Date:2020/7/7 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  2. Leetcode回溯算法经典题目总结

    回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 "回溯" 返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向前搜索 ...

  3. LeetCode回溯算法——51.N皇后问题详解

    51.N皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子. n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整 ...

  4. leetcode回溯算法

    LeetCode--回溯法心得 ​ 武汉大学 软件工程硕士在读 ​关注他 206 人赞同了该文章 这两天在刷LeetCode37题解数独时,被这个回溯法折腾的不要不要的,于是我疼定思疼发誓一定要找个能 ...

  5. leetcode 回溯算法 17. 电话号码的字母组合

    电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合.答案可以按 任意顺序 返回. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例 1: ...

  6. leetcode的回溯算法题目用这个模板解题,一网打尽,so easy!!!

    " 这是本人第 46 篇原创博文,每周至少两篇更新,谢谢赏脸阅读文章 这一篇文章来讲解一下如何做leetcode回溯算法题目,这一段时间我把leetcode上面的回溯算法的题目都刷了个遍,发 ...

  7. 回溯算法的题目,这样做,秒杀!!

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了 3 个月总结的一线大厂 Java 面试总结,本 ...

  8. 回溯算法——复原IP地址(Leetcode 93)

    题目选自Leetcode 93.复原IP地址 由于我们需要找出所有可能复原出的 IP 地址,因此可以考虑使用回溯的方法,对所有可能的字符串分隔方式进行搜索,并筛选出满足要求的作为答案. 通俗来讲,就是 ...

  9. sum 去重_总结leetcode上【排列问题】【组合问题】【子集问题】回溯算法去重的两种写法!...

    本周小结!(回溯算法系列三)续集 在 本周小结!(回溯算法系列三) 中一位录友对 整颗树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交 ...

最新文章

  1. 2018, 自动驾驶异常艰难的一年
  2. 帝国cms后台模板编辑器辅助增强插件代码高亮格式化显示
  3. 什么是神经网络在object detection的应用?cascade classifier,卷积神经网络,迁移学习
  4. 数据结构——排序算法(含动态图片)
  5. maven和docker_Java EE,Docker和Maven(技术提示#89)
  6. 微机原理——总线和时序
  7. 这个时代会残酷惩罚不肯改变的人
  8. mysql 查询和修改组合_## 超详细MySQL常用语句,增删查改
  9. VS.左侧_蓝黄绿_竖线
  10. 引用计数器法 可达性分析算法_面试官:你说你熟悉jvm?那你讲一下并发的可达性分析...
  11. Python 表白?别傻了,女神是拿来撩的!
  12. 记录MySql错误消息
  13. python help帮助文档
  14. python导入鸢尾花数据集_数据可视化——鸢尾花数据集的分析与散点图的绘制
  15. 企业邮箱怎样申请注册?
  16. js会员头像上传拖动处理头像类
  17. 西门子行贿门情报列表,我自己写的一个小软件自动搜集到的。
  18. 双11快速拉新促活,容联云智能客服助力商家提升GMV
  19. 在matplotlib使用中文坐标轴,设置坐标轴,标题字体及字体大小
  20. 国际验证码接口GO语言

热门文章

  1. 创界uVision下的ADuC845的工程文件
  2. ST-3806系列单圈编码器 说明书
  3. 2020年第十五届全国大学生智能汽车竞赛山东赛区成绩统计
  4. 为什么使用LM386可以直接收听调频电台节目?
  5. jquery.dataTables.min.js: Uncaught TypeError: Cannot read property 'style' of undefined
  6. vue cli 添加html,vue-cli创建的项目,配置多页面的实现方法
  7. function java_java.util.function之function
  8. flir红外数据集_设备停机导致损失惨重?FLIR红外自动化解决方案了解一下
  9. java公平索非公平锁_Java 并发编程中使用 ReentrantLock 替代 synchronized
  10. html表单输入框添加验证码,织梦Dedecms为自定义表单添加验证码功能