这次接触到记忆化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)的更多相关文章

  1. Leetcode题解 - 树部分简单题目代码+思路(105、106、109、112、897、257、872、226、235、129)

    树的题目中递归用的比较多(但是递归是真难弄 我

  2. Leetcode题解 - 树、DFS部分简单题目代码+思路(700、671、653、965、547、473、46)

    700. 二叉搜索树中的搜索 - 树 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在,则返回 NULL. 思路: 二 ...

  3. Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)

    leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三 ...

  4. Leetcode题解 - DFS部分题目代码+思路(756、1034、1110、491、721、988)

    756. 金字塔转换矩阵 """ 学到的新知识: from collections import defaultditc可以帮我们初始化字典,不至于取到某个不存在的值的时 ...

  5. Leetcode题解 - 链表简单部分题目代码+思路(21、83、203、206、24、19、876)

  6. Leetcode题解 - BFS部分题目代码+思路(896、690、111、559、993、102、103、127、433)

    和树有关的题目求深度 -> 可以利用层序遍历 -> 用到层序遍历就想到使用BFS 896. 单调数列 - 水题 class Solution: def isMonotonic(self, ...

  7. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  8. [LeetCode 题解] Combination Sum

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a se ...

  9. [LeetCode 题解]: Triangle

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a tr ...

随机推荐

  1. 第一次c语言作业。

    第一次c语言作业 作业1 2.1 你对软件工程专业或者计算机科学与技术专业了解是怎样? 我认为计算机科学与技术是研究信息过程.用以表达此过程的信息结构和规则及其在信息处理系统中实现的学科.这门学科是为 ...

  2. Linux:AWK基础

    AWK是一个强大的文本分析工具,算是Linux系统特别有用的命令了,在日志分析.文件内容分析中扮演特别重要的角色. AWK说明 简单来说awk就是把文件逐行的读入,以指定的分隔符将每行分割,分割后的部 ...

  3. SDWebImage学习之 NSCache

    1.使用SDWebImage的好处 1.异步下载(避免主线程卡死) 2.做好图片缓存(这样就不需要每次都加载网络图片) 3.解决了循环利用的问题 很容易造成内存警告

  4. Flink应用程序结构开发介绍

    Flink程序遵循一定的编程模式.DataStream API 和 DataSet API 基本具有相同的程序结构.以下为一个流式程序的示例代码来对文本文件进行词频统计. package com.re ...

  5. 2019-2020-1 20199304《Linux内核原理与分析》第四周作业

    第三章 MenuOs的构造 一.前情回顾 计算机的三大法宝: -存储程序计算机 -函数调用堆栈 -中断 操作系统的两把宝剑: -中断上下文的切换(保存现场和恢复现场) -进程上下文的切换 二.3.1 ...

  6. 转:JDK1.8-Stream()使用详解

    为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 ...

  7. VIM操作记录

    =============================================== 2019/12/12_第1次修改 vr7jj ============================= ...

  8. play-with-docker搭配ffsend完成文件上传及下载(解决从docker hub拉取镜像慢问题)

    由于众所周知的原因,大家有的时候pull docker hub上的镜像是很困难的,下载到99%就这么不动了也是很正常的事情 这个时候以下步骤是100%可以解决问题的: 1.找一台国外的服务器安装doc ...

  9. 清理Mac

    mac在更新系统以及Xcode时总是报磁盘空间不足.于是下定决心来清理一下. 1.首先点击管理,清理下大文件,以及倾倒垃圾篓. 2.下载mac清理工具,清理一些缓存文件. 3.查看下文件中占用最大的文 ...

  10. elasticsearch中mapping全解实战

    目录 Mapping简介 Mapping Type 分词器最佳实践 字段类型 text 类型 keyword 类型 date类型 object类型 nest类型 range类型 实战:同时使用keyw ...