回溯法

回溯法Backtracking(找所有的可能)递归:

  1. 类似枚举,一层一层向下递归,尝试搜索答案。
  2. 找到答案: => 返回答案,并尝试别的可能
  3. 未找到答案: => 返回上一层递归,尝试别的可能

实战

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

注意:在设计算法时,要谨记我们之前所说的递归四要素:

  1. 接收的参数
  2. 返回值
  3. 终止条件
  4. 递归拆解:如何递归下一层
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:# 扩展法# [ ]# [1]# [2] [1,2]# [3] [1,3] [2,3] [1,2,3]# res = []# res.append([])# for num in nums:#     temp = [] # 用于存储扩展后的若干子集#     for i in res:#         r = list(i) # 相当于copy,避免引用传递#         r.append(num)#         temp.append(r)#     for r in temp:#         res.append(r)# return res# 方法二:回溯法:[1,2,3] 子集长度介于0--3# Time Complexity:O(N*2^N)# Space Complexity:O(N*2^N)# 长度#   0   [ ]#   1   [1] [2] [3]#   2   [1,2] [1,3] [2,3]#   3   [1,2,3]result = [[]]# 因为等于0 的长度(空集)已经加进去了for i in range(1,len(nums)+1): self.backtracking(nums,result,i,0,[])return resultdef backtracking(self,nums,result,lenght,index,subset):# 终止条件:子集的长度 == 要找的长度if len(subset) == lenght:temp = list(subset) # 相当于copy,避免引用传递 list(subset)  等价于 subset[:]result.append(temp)return# 循环部分for i in range(index,len(nums)):subset.append(nums[i])self.backtracking(nums,result,lenght,i+1,subset)subset.pop() # 当backtracking出来一定要把新加入的元素删除掉# 方法三 DFS # Time Complexity:O(N*2^N)# Space Complexity:O(N*2^N)#     result = []#     self.dfs(nums,result,0,[])#     return result# def dfs(self,nums,result,index,subset):#     result.append(subset[:])#     # 终止条件#     if index == len(nums):#         return #     for i in range(index,len(nums)):#         subset.append(nums[i])#         self.dfs(nums,result,i+1,subset)#         subset.pop()

递归算法(三)- 回溯法Backtracking相关推荐

  1. 回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle)

    转载自:用回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle) N皇后问题 八皇后问题,是一个古老而著名的问题.该问题是国际西洋棋棋手马克斯·贝瑟尔于 ...

  2. 回溯法|Backtracking

    回溯法 回溯是一种算法,用于捕获给定计算问题的部分或全部解决方案,特别是约束满足问题.该算法只能用于能够接受"部分候选解"概念的问题,并允许快速测试候选解是否可以是一个完整的解.回 ...

  3. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

  4. 搜索---广度优先遍历、深度优先遍历、回溯法

    参考文章:https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E6%9 ...

  5. leetcode2021年度刷题分类型总结(三)回溯法 (python)

    主要参考:代码随想录 分为三个部分对回溯法进行总结 1.组合 例一:77. 组合 组合问题关键在于[1,4]和[4,1]算作重复答案,也即取数时往前推进,取到4时不能回头取1,所以每次都要记录取到的位 ...

  6. 数据结构与算法(Python)– 回溯法(Backtracking algorithm)

    数据结构与算法(Python)– 回溯法(Backtracking algorithm) 1.回溯法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条 ...

  7. 回溯法解决01背包-非递归算法-效率低

    http://acm.zua.edu.cn/problem.php?cid=1025&pid=24 解题思路: 物体的个数为Num,背包的体积限制为Volum 物品的体积是v[1].v[2]. ...

  8. 五大算法思想(三)回溯法及常见例子

    文章目录 一.理论基础 1.1 基本策略 1.2 使用步骤 1.3 经典例子 二.常见例子 2.1 八皇后问题 2.2 装载问题 2.3 批量作业调度问题 2.4 背包问题 一.理论基础   回溯法作 ...

  9. 回溯法实例详解(转)

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

最新文章

  1. pprof搭配ceph tell命令分析ceph内存
  2. 活着不易,5G时代终端厂商的路在何方?
  3. quartz 本地有效,线上失效的问题
  4. 实现自己的控制层do-c (仿Struts2和SpringMVC)(六)
  5. java统计空格代码_java统计文件中字符,数字,汉字,空格数目
  6. 单片机用c语言编程软件手机版,单片机C语言编程软件(mikroc pro for pic)下载 V7.1.0 官方版 - 比克尔下载...
  7. 概率论与数理统计浙大第五版 第一章 部分习题+R代码
  8. OpenCV图像处理----图像的二值化
  9. 综合管廊:道路工程综合管廊施工方案(图文)
  10. Linux释放内存的命令
  11. 自定义 SpringBoot Banner 图案
  12. 固态硬盘是什么接口_PCI-E接口的固态硬盘和SATA接口的有什么区别?
  13. API-String中的某些方法
  14. 微信“小程序”来了,短期不可高估,长期不可低估
  15. Unity 项目游戏退出代码
  16. MySQL引擎之Memory
  17. C#怎样解析.CSV文件同时把类转换成JSON
  18. JavaSE笔记 [全文字数7.1W]
  19. 经济学人(The Economist)导读(阅时即查,每日更新)
  20. Error Code 1318 Incorrect number of arguments for PROCEDUR

热门文章

  1. Android之Andorid studio 解决Error:Configuration with name ‘default‘ not found
  2. 老师计算机传帮带工作总结,传帮带工作总结范文
  3. python listbox排序_python – 从tkinter.Listbox中提取项目列表
  4. 实验 6 场景创建与执行 实验报告--软件功能测试与性能测试实验
  5. 现在要吃软饭的,都这么明目张胆了吗?
  6. 网友半夜差点被沐浴露吓死,众人:原来不止我胆小....
  7. 程序员从入门到升级,或许可以看一看这几个公众号
  8. 史上最变态高考数学题,让99%的考生献上膝盖,看完我惊了......
  9. 入门机器学习,就这么简单!
  10. 计算机如何实现共享接入,局域网内电脑实现共享设置方法