Leetcode题解 - DFS部分简单题目代码+思路(113、114、116、117、1020、494、576、688)
这次接触到记忆化DFS,不过还需要多加练习
113. 路径总和 II - (根到叶子结点相关信息记录)

"""
思路:
本题 = 根到叶子结点的路径记录 + 根到叶子结点的值记录
"""
class Solution:
def pathSum(self, root: TreeNode, sum: int) -> List[List[int]]:
res = []
def DFS(root, s, tmp):
if not root:
return
if not root.left and not root.right and s-root.val == 0:
res.append(tmp+[root.val].copy())
DFS(root.left, s - root.val, tmp + [root.val])
DFS(root.right, s - root.val, tmp + [root.val])
DFS(root, sum, [])
return res
114. 二叉树展开为链表

"""
思路:
树的前序遍历再重新建树
需要主要的点是本题要求的是 !原地! 展开,所以建树的时候原始根结点不动。
"""
class Solution:
def flatten(self, root: TreeNode) -> None:
"""
Do not return anything, modify root in-place instead.
"""
if not root:
return
res = []
# 前序遍历
def Preorder(root):
if not root:
return
res.append(root.val)
Preorder(root.left)
Preorder(root.right)
Preorder(root)
res = res[1:]
treeNode = [root]
# 重新建树,左节点为空,右节点为其先序遍历的下一个。
while len(res) != 0:
tree = treeNode.pop(0)
rightChild = TreeNode(res.pop(0))
tree.right = rightChild
# 不要忘了将左边置为空
tree.left = None
treeNode.append(rightChild)
116. 填充每个节点的下一个右侧节点指针 / 117. 填充每个节点的下一个右侧节点指针 II
(116和117同样的代码都可以通过。)

"""
树的层次遍历,每一个的next指向同层的下一个即可。
"""
class Solution:
def connect(self, root: 'Node') -> 'Node':
if not root:
return
Q = [(root, 0)]
pre = []
tmp = []
res = []
level = set()
level.add(0)
# 对树进行层次遍历
while len(Q) != 0:
node, deepth = Q.pop(0)
if deepth not in level:
res.append(tmp.copy())
tmp.clear()
level.add(deepth)
tmp.append(node)
if node.left:
Q.append((node.left, deepth+1))
if node.right:
Q.append((node.right, deepth+1))
res.append(tmp.copy())
# 每一个的next都是同层的下一个
for i in range(1, len(res)):
for j in range(len(res[i])-1):
res[i][j].next = res[i][j+1]
return root
1020. 飞地的数量

"""
从边界的1开始出发(对可以到达的1进行染色),最后剩下的1就是飞地
"""
class Solution:
def numEnclaves(self, A) -> int:
# print(A)
vis = set()
directx = [-1, 1, 0, 0]
directy = [0, 0, -1, 1]
def DFS(x, y):
A[x][y] = 2
for i in range(4):
newx, newy = x + directx[i], y + directy[i]
if -1 < newx < len(A) and -1 < newy < len(A[0]):
if (newx, newy) not in vis and A[newx][newy] == 1:
vis.add((newx, newy))
if DFS(newx, newy):
return True
return False
# 对第一行和最后一行的1
for i in range(len(A[0])):
if A[0][i] == 1 and (0, i) not in vis:
DFS(0, i)
if A[len(A) - 1][i] == 1 and (len(A) - 1, i) not in vis:
DFS(len(A) - 1, i)
# 对第一列和最后一列的1
for i in range(len(A)):
if A[i][0] == 1 and (i, 0) not in vis:
DFS(i, 0)
if A[i][len(A[0]) - 1] == 1 and (i, len(A[0]) - 1) not in vis:
DFS(i, len(A[0]) - 1)
res = 0
for i in A:
for j in i:
if j == 1:
res += 1
return res
lru_cache装饰器
from functools import lru_cache
@lru_cache(None)
使用时候需要注意什么是可以被记忆的?
eg:为函数传入相同的一对参数其总是会返回相同的结果
494. 目标和 - 记忆化DFS

"""
思路:
利用DFS求出所有组合题型 -> DFS超时了(DFS不好好剪枝真的很容易超时
Leetcode题解 - DFS部分简单题目代码+思路(113、114、116、117、1020、494、576、688)的更多相关文章
- Leetcode题解 - 树部分简单题目代码+思路(105、106、109、112、897、257、872、226、235、129)
树的题目中递归用的比较多(但是递归是真难弄 我
- Leetcode题解 - 树、DFS部分简单题目代码+思路(700、671、653、965、547、473、46)
700. 二叉搜索树中的搜索 - 树 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. 思路: 二 ...
- Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)
leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三 ...
- Leetcode题解 - DFS部分题目代码+思路(756、1034、1110、491、721、988)
756. 金字塔转换矩阵 """ 学到的新知识: from collections import defaultditc可以帮我们初始化字典,不至于取到某个不存在的值的时 ...
- Leetcode题解 - 链表简单部分题目代码+思路(21、83、203、206、24、19、876)
- Leetcode题解 - BFS部分题目代码+思路(896、690、111、559、993、102、103、127、433)
和树有关的题目求深度 -> 可以利用层序遍历 -> 用到层序遍历就想到使用BFS 896. 单调数列 - 水题 class Solution: def isMonotonic(self, ...
- 【LeetCode题解】二叉树的遍历
我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...
- [LeetCode 题解] Combination Sum
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a se ...
- [LeetCode 题解]: Triangle
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a tr ...
随机推荐
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(3)- Serial ISP模式(blhost)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Serial ISP模式. 在上一篇文章 Boot配置(ISP Pin, OTP) 里痞子衡为大家 ...
- C# Properties文件夹 Bin 目录 Bin 目录
Properties文件夹 定义你程序集的属性 项目属性文件夹 一般只有一个 AssemblyInfo.cs 类文件,用于保存程序集的信息,如名称,版本等,这些信息一般与项目属性面板中的数据对应,不需 ...
- css圆,背景,img填满等样式
background 属性 属性值 描述 background-color 单词颜色表示法.rgb.十六进制 设置元素的背景颜色 background-image url('http://www.aa ...
- Spring Boot 2.0 学习笔记(一)——JAVA EE简介
本章内容:JAVA EE>Spring>Spring Boot 一.JAVA EE简介 1.1 Java ee优点:结束了Web开发的技术无序状态,让程序员.架构师用同一种思维去思考如何架 ...
- 《Dotnet9》系列-开源C# WPF控件库3《HandyControl》强力推荐
大家好,我是Dotnet9小编,一个从事dotnet开发8年+的程序员.我最近开始写dotnet分享文章,希望能让更多人看到dotnet的发展,了解更多dotnet技术,帮助dotnet程序员应用do ...
- 漫谈边缘计算(三):5G的好拍档
边缘计算的热度迅速攀升,还有一个不得不提的因素,就是5G的发展. [5G推动云计算从集中化向分布式演进] 在第一篇文章(<漫谈边缘计算(一):边缘计算是大势所趋>)中我提到,传统的云计算技 ...
- 【Java库】如何使用优秀的加密库Jasypt来保护你的敏感信息?
1 简介 今天我们介绍一个Java库-Jasypt,全称为Java Simplified Encryption,用于加密解密.它能够让开发者用花费最小的工作而把加密集成到项目中,并且不需要对加密/解密 ...
- Python的Requests库基本方法函数
一.Requests 库的七个常用函数: 1. requests.request(method,url,**kwargs) :method:请求方式,对应get/put/post等七种 :拟获取页面的 ...
- 普通莫队--洛谷P1997 【faebdc的烦恼】
离散化+莫队 cnt数组表示某个颜色出现的次数 sum数组表示某个数量出现的颜色种类 其它细节问题就按照莫队的模板来的 #include<cstdio> #include<algor ...
- 第五章 初始jQuery
jQuery与JavaScript: jQuery的用途: 访问和操作DOM元素: 控制页面样式: 对页面事件的处理: 方便地使用jQuery插件: 与Ajax技术的完美结合: jQuery的优势: ...