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 ...
随机推荐
- Tomcat连接器详解
1.连接器等同于nginx中的引擎. 2.tomcat连接器有三种运行模式bio.nio.apr . (1)bio(blocking I/O,阻塞式I/O操作) 1)表示tomcat使用的是传统的ja ...
- svn+apache搭建版本控制服务器
Centos7(linux)搭建版本控制服务器(svn+apache) 1.简介: 版本控制服务器: 版本控制(Revision control)是一种软体工程技巧,籍以在开发的过程中,确保由不同人所 ...
- 企业DevOps研发模式下CI/CD实践详解指南
阅读全文大概需要 10分钟. 1. 前言 借着公司今年新组建的中台研发部东风,我作为其中的主要负责人,在研发中心主导推行DevOps研发管理模式转变及质量管理创新建设,本篇文章摘取自今年9月底,笔者在 ...
- socket实现一个简单的echo服务
服务端的实现: public class EchoServer{ //创建一个serverSocket private final ServerSocket serverSocket; //创建一个构 ...
- Python开发还在用virtualenv?不如了解下pipenv...#华为云·寻找黑马程序员#
又见 Kenneth Reitz 之前公众号写了一篇文章爬虫新宠requests_html 带你甄别2019虚假大学,其中主要是为了介绍模块**requests_html,这个模块的作者还开发了req ...
- springcloud集成redis
1.application.properties/application.yml配置: redis: # redis数据库索引(默认为0),我们使用索引为3的数据库,避免和其他数据库冲突 databa ...
- 解决 Docker Hadoop ssh "Connection to * closed".问题
Docker 最近很火, 可以快速轻量级地虚拟出多个node,所以打算在Docker中跑Hadoop伪分布式应用. 其实要做出个简单的版本倒是不难,主要在 建立ssh无密码登录本机时,出现刚登录上去, ...
- [开源] .Net 使用 ORM 访问 达梦数据库
前言 武汉达梦数据库有限公司成立于2000年,为中国电子信息产业集团(CEC)旗下基础软件企业,专业从事数据库管理系统的研发.销售与服务,同时可为用户提供大数据平台架构咨询.数据技术方案规划.产品部署 ...
- ios 在APP内提示更新
http://www.jianshu.com/p/24daf5147bda ios如何在应用内部提示更新 两颗星 http://www.jianshu.com/p/2ba10a58bb02 ...
- “Unknown class XXViewController in Interface Builder file.”问题处理
在静态库中写了一个XXViewController类,然后在主工程的xib中,将xib的类指定为XXViewController,程序运行时,报了如下错误: “Unknown class XXView ...