递归算法(三)- 回溯法Backtracking
回溯法
回溯法Backtracking(找所有的可能)递归:
- 类似枚举,一层一层向下递归,尝试搜索答案。
- 找到答案: => 返回答案,并尝试别的可能
- 未找到答案: => 返回上一层递归,尝试别的可能
实战
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
注意:在设计算法时,要谨记我们之前所说的递归四要素:
- 接收的参数
- 返回值
- 终止条件
- 递归拆解:如何递归下一层
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相关推荐
- 回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle)
转载自:用回溯法(backtracking algorithm)求解N皇后问题(N-Queens puzzle) N皇后问题 八皇后问题,是一个古老而著名的问题.该问题是国际西洋棋棋手马克斯·贝瑟尔于 ...
- 回溯法|Backtracking
回溯法 回溯是一种算法,用于捕获给定计算问题的部分或全部解决方案,特别是约束满足问题.该算法只能用于能够接受"部分候选解"概念的问题,并允许快速测试候选解是否可以是一个完整的解.回 ...
- 算法设计与分析 实验三 回溯法求解地图填色问题
回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...
- 搜索---广度优先遍历、深度优先遍历、回溯法
参考文章:https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E6%9 ...
- leetcode2021年度刷题分类型总结(三)回溯法 (python)
主要参考:代码随想录 分为三个部分对回溯法进行总结 1.组合 例一:77. 组合 组合问题关键在于[1,4]和[4,1]算作重复答案,也即取数时往前推进,取到4时不能回头取1,所以每次都要记录取到的位 ...
- 数据结构与算法(Python)– 回溯法(Backtracking algorithm)
数据结构与算法(Python)– 回溯法(Backtracking algorithm) 1.回溯法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条 ...
- 回溯法解决01背包-非递归算法-效率低
http://acm.zua.edu.cn/problem.php?cid=1025&pid=24 解题思路: 物体的个数为Num,背包的体积限制为Volum 物品的体积是v[1].v[2]. ...
- 五大算法思想(三)回溯法及常见例子
文章目录 一.理论基础 1.1 基本策略 1.2 使用步骤 1.3 经典例子 二.常见例子 2.1 八皇后问题 2.2 装载问题 2.3 批量作业调度问题 2.4 背包问题 一.理论基础 回溯法作 ...
- 回溯法实例详解(转)
概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径. 回溯法是一种选优搜索法,按选优条件向前 ...
最新文章
- pprof搭配ceph tell命令分析ceph内存
- 活着不易,5G时代终端厂商的路在何方?
- quartz 本地有效,线上失效的问题
- 实现自己的控制层do-c (仿Struts2和SpringMVC)(六)
- java统计空格代码_java统计文件中字符,数字,汉字,空格数目
- 单片机用c语言编程软件手机版,单片机C语言编程软件(mikroc pro for pic)下载 V7.1.0 官方版 - 比克尔下载...
- 概率论与数理统计浙大第五版 第一章 部分习题+R代码
- OpenCV图像处理----图像的二值化
- 综合管廊:道路工程综合管廊施工方案(图文)
- Linux释放内存的命令
- 自定义 SpringBoot Banner 图案
- 固态硬盘是什么接口_PCI-E接口的固态硬盘和SATA接口的有什么区别?
- API-String中的某些方法
- 微信“小程序”来了,短期不可高估,长期不可低估
- Unity 项目游戏退出代码
- MySQL引擎之Memory
- C#怎样解析.CSV文件同时把类转换成JSON
- JavaSE笔记 [全文字数7.1W]
- 经济学人(The Economist)导读(阅时即查,每日更新)
- Error Code 1318 Incorrect number of arguments for PROCEDUR
热门文章
- Android之Andorid studio 解决Error:Configuration with name ‘default‘ not found
- 老师计算机传帮带工作总结,传帮带工作总结范文
- python listbox排序_python – 从tkinter.Listbox中提取项目列表
- 实验 6 场景创建与执行 实验报告--软件功能测试与性能测试实验
- 现在要吃软饭的,都这么明目张胆了吗?
- 网友半夜差点被沐浴露吓死,众人:原来不止我胆小....
- 程序员从入门到升级,或许可以看一看这几个公众号
- 史上最变态高考数学题,让99%的考生献上膝盖,看完我惊了......
- 入门机器学习,就这么简单!
- 计算机如何实现共享接入,局域网内电脑实现共享设置方法