Leetcode题解 - 树、DFS部分简单题目代码+思路(700、671、653、965、547、473、46)
700. 二叉搜索树中的搜索 - 树
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
思路:
二叉搜索树的特点为左比根小,右比根大。那么目标结点就有三种可能:
1. 和根一样大,那么直接返回根即可。
2. 比根的值小,那么应该再去次左子树中搜索。
3. 比根的值大,那么应该再次去右子树中搜索。
可以看到这就是一个递归的思路。
class Solution:
def searchBST(self, root: TreeNode, val: int) -> TreeNode:
if not root:
return
if val == root.val:
return root
# 比根的值小就去左子树
if val < root.val:
lres = self.searchBST(root.left, val)
if lres: return lres
# 否则就去右子树
if val > root.val:
rres = self.searchBST(root.right, val)
if rres: return rres
return None
671. 二叉树中第二小的节点 - 树
给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值。
给出这样的一个二叉树,你需要输出所有节点中的第二小的值。如果第二小的值不存在的话,输出 -1 。
思路:
(并没有想到很巧妙的方法emmm)
直接BFS遍历树,将大于根结点的值都保存起来(因为题目条件中说明了子节点的值都是大于or等于父节点的,那么根一定是最小的),如果这些值存在那么最小的一个一定为第二小的,否则就是不存在。
# self.right = None
class Solution:
def findSecondMinimumValue(self, root: TreeNode) -> int:
if not root:
return -1
Q = [root]
res = []
while len(Q) != 0:
node = Q.pop(0)
if node.val > root.val:
res.append(node.val)
if node.left:
Q.append(node.left)
if node.right:
Q.append(node.right)
if len(res) == 0:
return -1
return min(res)
*653. 两数之和 IV - 输入 BST - 树 -> 双指针 *
给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
思路:
(看了题解才想出来...两个数字和的问题似乎经常和双指针有关)
因为是二叉搜索树,所以中序遍历的结果就是一个递增序列。双指针法的前提就是递增序列,然后用一个指针指向头,一个指针指向尾,不断移动两个指针判断是否符合条件。
class Solution:
def findTarget(self, root: TreeNode, k: int) -> bool:
inRes = []
# 中序遍历
def Inorder(root):
if not root:
return
Inorder(root.left)
inRes.append(root.val)
Inorder(root.right)
Inorder(root)
# 双指针
head = 0; tail = len(inRes) - 1
while head < tail:
res = inRes[head] + inRes[tail]
# 如果大于目标值,就让尾指针左移
if res > k:
tail -= 1
# 如果小于目标值,就让头指针右移
if res < k:
head += 1
if res == k:
return True
return False
965. 单值二叉树 - 树
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。
思路:
遍历一遍树即可,这里采用的是层次遍历,但凡出现和根结点的值不同的值就绝对不是单值。
class Solution:
def isUnivalTree(self, root: TreeNode) -> bool:
if not root:
return False
Q = [root]
check = root.val
while len(Q) != 0:
node = Q.pop(0)
if node.val != check:
return False
if node.left:
Q.append(node.left)
if node.right:
Q.append(node.right)
return True
547. 朋友圈 - DFS -> 统计连通块的数量
班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。
给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。
思路:
直接套DFS模板即可,相当于判断一共做了几次DFS。
这个题的本质就是在求图中有几个连通块。
class Solution:
def findCircleNum(self, M: List[List[int]]) -> int:
res = 0
vis = set()
# 每一次的DFS都会把属于同一个朋友圈的人加上vis中
def DFS(node):
vis.add(node)
for i in range(len(M[node])):
if M[node][i] == 1 and i not in vis:
DFS(i)
for i in range(len(M)):
# 剩下的没有被加入vis中才会再次进行DFS
if i not in vis:
DFS(i)
res += 1
return res
DFS - 求出所有的组合
473. 火柴拼正方形 - 含重复
输入为小女孩拥有火柴的数目,每根火柴用其长度表示。输出即为是否能用所有的火柴拼成正方形。
输入: [1,1,2,2,2]
输出: true
解释: 能拼成一个边长为2的正方形,每边两根火柴。
输入: [3,3,3,3,4]
输出: false
解释: 不能用所有火柴拼成一个正方形。
思路:
对于每一根火柴来说,它都有四个边可以去(不同的火柴可以去相同的边),这样只要求解出所有火柴的每一种摆放组合就可以得知是否能够称为正方形
"""
DFS遍历所有可能性
本题剪枝很重要,不然会很容易超时。
"""
class Solution:
def makesquare(self, nums) -> bool:
# 如果数组和不是4的倍数,一定不能拼成正方形
sumRes = sum(nums)
if len(nums) < 4 or sum(nums) % 4 != 0:
return False
# 若有一个数大于数组和/4,也一定不能拼成正方形
check = sumRes // 4
nums.sort(reverse=True)
if nums[0] > check:
return False
# 遍历每根火柴loc为该跟火柴的下标,square为正方形的各个边
def DFS(loc, square):
if len(set(square)) == 1 and 0 not in square and loc == len(nums):
return True
if loc > len(nums) -1:
return
# 每根火柴有四个地方可以放置
for i in range(4):
if square[i] + nums[loc] <= check:
square[i] += nums[loc]
# 让下一个位置的火柴去放
if DFS(loc + 1, square):
return True
# 表示不应该放在这个位置
square[i] -= nums[loc]
return False
return DFS(0, [0, 0, 0, 0])
46. 全排列 - 不含重复
给定一个没有重复数字的序列,返回其所有可能的全排列。
思路:
就是DFS的套路,(一共有n个数字,n个位置)每个位置都有n个数字可以选择,在一次排列中一个数字只能属于一个位置。
class Solution:
def permute(self, nums):
vis = set()
r = []
def DFS(loc, res):
if loc == len(nums):
r.append(res.copy())
# 每个位置n个数字
for i in nums:
if i not in vis:
vis.add(i)
res[loc] = i
DFS(loc + 1, res)
vis.remove(i)
DFS(0, [0] * len(nums))
return sorted(r)
Leetcode题解 - 树、DFS部分简单题目代码+思路(700、671、653、965、547、473、46)的更多相关文章
- Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)
leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三 ...
- Leetcode题解 - DFS部分简单题目代码+思路(113、114、116、117、1020、494、576、688)
这次接触到记忆化DFS,不过还需要多加练习 113. 路径总和 II - (根到叶子结点相关信息记录) """ 思路: 本题 = 根到叶子结点的路径记录 + 根到叶子结点 ...
- Leetcode题解 - 树部分简单题目代码+思路(105、106、109、112、897、257、872、226、235、129)
树的题目中递归用的比较多(但是递归是真难弄 我
- 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, ...
- BZOJ_3252_攻略_线段树+dfs序
BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...
- Leetcode 与树(TreeNode )相关的题解测试工具函数总结
最近在剑指Offer上刷了一些题目,发现涉及到数据结构类的题目,如果想在本地IDE进行测试,除了完成题目要求的算法外,还需要写一些辅助函数,比如树的创建,遍历等,由于这些函数平时用到的地方比较多,并且 ...
- c++ LeetCode (网易面试题和链表以及树篇) 五道算法例题代码详解(三)
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11209807.html 一.1道网易c++的面试题 我当时第一时间的解答方案 #include ...
随机推荐
- js中this的使用及代表意义
我们在js中经常看到this这个关键字,那么他是什么呢?它可以是全局对象.当前对象,也可以是任意对象,函数的调用方式决定了 this 的值. 1. 方法中的this. 在对象方法中, this 指向调 ...
- flask-简介
什么是flask? Flask简介: Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务,在介绍Flask之前首先来聊下它和Django的联系 ...
- PAT(甲级)2019年春季考试
7-1 Sexy Primes 判断素数 一个点没过17/20分 错因:输出i-6写成了输出i,当时写的很乱,可以参考其他人的写法 #include<bits/stdc++.h> usin ...
- Anticancer Effect of Deuterium Depleted Water - Redox Disbalance Leads to Oxidative Stress(低氘水的抗癌作用-氧化还原失衡导致了氧化应激)-解读人:范徉
期刊名:Molecular & Cellular Proteomics 发表时间:(2019年12月) IF:4.828 单位:瑞典卡罗林斯卡学院 物种:人 技术:标记定量蛋白质组学,氧化还原 ...
- OCR文字识别在计算机视觉的重要性、基本技术和最新进展
[摘要] 主要是文字检测和文字识别作为计算机视觉一部分的重要性,基本知识,面临的挑战,以及部分最新的成果. 人类认识了解世界的信息中91%来自视觉,同样计算机视觉成为机器认知世界的基础,也是人工智能研 ...
- 链接脚本(Linker Script)用法解析(一) 关键字SECTIONS与MEMORY
1.MEMORY关键字用于描述一个MCU ROM和RAM的内存地址分布(Memory Map),MEMORY中所做的内存描述主要用于SECTIONS中LMA和VMA的定义. 2.SECTIONS关键字 ...
- NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因
认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...
- PDF怎么删除页面?教你两个超级好用的方法
在日常办公中,由于工作需要我们有时候会对PDF文件中的内容进行二次编辑,可能需要删除PDF文件中的一些页面.那么PDF怎么删除页面呢?小伙伴们还在为这个问题苦恼吗?那么今天小编就来教大家两个超级好用的 ...
- BZOJ [ZJOI2007]矩阵游戏(二分图匹配)
1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6390 Solved: 3133[Submit][Stat ...
- Altium PCB二维码Logo设计(转 crazybingo)
Altium PCB二维码Logo设计 每次设计PCB的时候,都会在空白部分放Logo上去,一来板卡显得更充实,二来更有成就感一些... 今天突然想着...这两年二维码越来越火,火到快爆发,不如在板卡 ...