From 80e4f5b42ac3df01b318c1fb0e709c02ea5080d4 Mon Sep 17 00:00:00 2001 From: kn5886348135 <56352848+kn5886348135@users.noreply.github.com> Date: Thu, 22 Dec 2022 16:58:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A7=84=E5=88=92=20?= =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=20=E8=B4=AA=E5=BF=83=E7=AE=97?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- algorithm/12、动态规划.md | 2 + algorithm/6、二叉树.md | 138 +++++++++++++++++++++++++++++---- algorithm/9、贪心算法.md | 63 +++++++++++++-- 3 files changed, 182 insertions(+), 21 deletions(-) diff --git a/algorithm/12、动态规划.md b/algorithm/12、动态规划.md index a8cf3f8..6af229c 100644 --- a/algorithm/12、动态规划.md +++ b/algorithm/12、动态规划.md @@ -110,6 +110,8 @@   规定1和A对应、2和B对应、3和C对应...26和Z对应。那么一个数字字符串比如"111”就可以转化为:"AAA"、"KA"和"AK"。给定一个只有数字字符组成的字符串str,返回有多少种转化结果? +#### 剪裁贴纸 +   给定一个字符串str,给定一个字符串类型的数组arr,出现的字符都是小写英文。arr每一个字符串,代表一张贴纸,你可以把单个字符剪开使用,目的是拼出str来。返回需要至少多少张贴纸可以完成这个任务。   例子:str= "babac",arr = {"ba","c","abcd"} ba + ba + c 3 abcd + abcd 2 abcd+ba 2 所以返回2 diff --git a/algorithm/6、二叉树.md b/algorithm/6、二叉树.md index 0f3b348..edfcc0d 100644 --- a/algorithm/6、二叉树.md +++ b/algorithm/6、二叉树.md @@ -1,16 +1,85 @@ -#### 合并K个升序链表 LeetCode2 +##
二叉树
-使用PriorityQueue保存各链表的头结点,每次prorityQueue.poll()弹出最小值,注意单链表的next指针和中间变量。循环终止条件为优先级队列变空。 +递归序 每个节点都到达三次 -二叉树 -先序遍历 头左右 -中序遍历 左头右 -后序遍历 左右头 +#### 二叉树的先序、中序、后序遍历 -递归序 每个节点都到达三次 +先序:任何子树的处理顺序都是,先头节点、再左子树、然后右子树 +中序:任何子树的处理顺序都是,先左子树、再头节点、然后右子树 +后序:任何子树的处理顺序都是,先左子树、再右子树、然后头节点 + +#### 递归方式实现二叉树的先序、中序、后序遍历 + +1)理解递归序 +2)先序、中序、后序都可以在递归序的基础上加工出来 +3)第一次到达一个节点就打印就是先序、第二次打印即中序、第三次即后序 + +#### X 祖先节点 交集 + +
+
+  X是一棵二叉树的某一个节点,A是二叉树先序遍历X的左边部分,B是二叉树后序遍历X右边部分,AB相交的结果是且仅是X的所有父节点。 +1、X的所有父节点在先序遍历的左边,X的所有父节点在后序遍历的右边,交集一定包含所有父节点 +2、X的所有子节点在先序遍历的左边,X的所有子节点在后序遍历的左边,交集一定不包含所有子节点 +3、A不包含所有祖先节点的右兄弟节点,B不包含所有祖先节点的左兄弟节点 +  X的所有祖先节点、X自己、X的子节点、X或者X的父节点作为左树的右兄节点、X或者X的父节点作为右树的左兄节点 +
+
+ +#### 非递归方式实现二叉树的先序、中序、后序遍历 + +1)任何递归函数都可以改成非递归 +2)自己设计压栈的来实现 + +#### 实现二叉树的按层遍历 + +1)其实就是宽度优先遍历,用队列 +2)可以通过设置flag变量的方式,来发现某一层的结束 + +#### 实现二叉树的序列化和反序列化 + +1)先序方式序列化和反序列化 +2)按层方式序列化和反序列化 + +#### 将多叉树编码为二叉树 LeetCode431 + +#### 打印二叉树 + +#### 二叉树的宽度 + +求二叉树最宽的层有多少个节点 + +#### 找出某个节点的后继节点 + +  二叉树结构如下定义: + +```Java +Class Node { + V value; + Node left; + Node right; + Node parent; +} +``` + +  给你二叉树中的某个节点,返回该节点的后继节点。 + +#### 折纸 + +  请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。 如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。 +给定一个输入参数N,代表纸条都从下边向上方连续对折N次。 请从上到下打印所有折痕的方向。 +例如:N=1时,打印: down N=2时,打印: down down up 主要解题思路是递归 +二叉树的递归套路 +1)假设以X节点为头,假设可以向X左树和X右树要任何信息 +2)在上一步的假设下,讨论以X为头节点的树,得到答案的可能性(最重要) +3)列出所有可能性后,确定到底需要向左树和右树要什么样的信息 +4)把左树信息和右树信息求全集,就是任何一棵子树都需要返回的信息S +5)递归函数都返回S,每一棵子树都这么要求 +6)写代码,在代码中考虑如何把左树的信息和右树信息整合出整棵树的信息 + #### 判断两颗二叉树是否相同 LeetCode100 #### 判断一个二叉树是否对称 LeetCode101 @@ -27,6 +96,7 @@ #### 平衡二叉树 LeetCode110 +给定一棵二叉树的头节点head,返回这颗二叉树是不是平衡二叉树 判断二叉树是否是平衡二叉树 左子树的高度和右子树的高度相差不超过1,则称为平衡二叉树。 @@ -39,12 +109,52 @@ #### 达标路径总和 LeetCode113 -X是一棵二叉树的某一个节点,A是二叉树先序遍历X的左边部分,B是二叉树后序遍历X右边部分,AB相交的结果是且仅是X的所有父节点。 -1、X的所有父节点在先序遍历的左边,X的所有父节点在后序遍历的右边,交集一定包含所有父节点 -2、X的所有子节点在先序遍历的左边,X的所有子节点在后序遍历的左边,交集一定不包含所有子节点 -3、A不包含所有祖先节点的右兄弟节点,B不包含所有祖先节点的左兄弟节点 +#### 二叉树的最大距离 + +给定一颗二叉树的头结点,任何两个节点之间都存在距离,返回整颗二叉树的最大距离。 + +#### 判断完全二叉树 + +判断二叉树是否是完全二叉树 +按照二叉树的定义判断,逐行遍历 +递归套路 + +#### 满二叉树 + +给定一棵二叉树的头节点head,返回这颗二叉树是不是满二叉树 + +#### 最大的二叉搜索子树 + +给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的头节点。 + +#### 最大的二叉搜索子树大小 + +给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的大小。 + +#### 最低公共祖先 + +给定一棵二叉树的头节点head,和另外两个节点a和b。返回a和b的最低公共祖先。 +a、b可能在head的左右子树,也可能在同一棵子树。 +使用中间变量 +1、遍历整棵树,用map保存所有节点的父节点 +2、遍历a的所有父节点,用set保存 +3、遍历b的所有父节点,看set中是否存在 +后序遍历递归套路 + +#### 派对的最大快乐值 + +  员工信息的定义如下: -X的所有祖先节点、X自己、X的子节点、X或者X的父节点作为左树的右兄节点、X或者X的父节点作为右树的左兄节点 +```Java +class Employee { + public int happy; // 这名员工可以带来的快乐值 + List subordinates; // 这名员工有哪些直接下级 +} +``` -给定一颗二叉树的头结点,任何两个节点之间都存在距离,返回整颗二叉树的最大距离 -二叉树node的a、b两个节点的最低公共祖先,可以使用递归套路,也可以使用set或者map结合后序遍历实现 +   公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、 没有环的多叉树。树的头节点是公司唯一的老板。除老板之外的每个员工都有唯一的直接上级。 叶节点是没有任何下属的基层员工(subordinates列表为空),除基层员工外,每个员工都有一个或多个直接下级。 +  这个公司现在要办party,你可以决定哪些员工来,哪些员工不来,规则: +  1.如果某个员工来了,那么这个员工的所有直接下级都不能来 +  2.派对的整体快乐值是所有到场员工快乐值的累加 +  3.你的目标是让派对的整体快乐值尽量大 +  给定一棵多叉树的头节点boss,请返回派对的最大快乐值。 diff --git a/algorithm/9、贪心算法.md b/algorithm/9、贪心算法.md index 9630549..4e1da83 100644 --- a/algorithm/9、贪心算法.md +++ b/algorithm/9、贪心算法.md @@ -1,10 +1,59 @@ -贪心算法 +##
贪心算法
-a.b<反例的证明就是哈夫曼编码。 + +#### 点灯 + +  给定一个字符串str,只由‘X’和‘.’两种字符构成。‘X’表示墙,不能放灯,也不需要点亮。‘.’表示居民点,可以放灯,需要点亮。如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮。返回如果点亮str中所有需要点亮的位置,至少需要几盏灯。 + +#### 安排会议室 + +  一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。给你每一个项目开始的时间和结束的时间,你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。返回最多的宣讲场次。 + +#### IPO + +  输入: 正数数组costs、正数数组profits、正数K、正数M +  costs[i]表示i号项目的花费 +  profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) +  K表示你只能串行的最多做k个项目 +  M表示你初始的资金 +  说明: 每做完一个项目,马上获得的收益,可以支持你去做下一个项目。不能并行的做项目。 +  输出:你最后获得的最大钱数。