
算法和数据结构
文章平均质量分 78
算法和数据结构
GreyZeng
程序员,架构师,项目经理
展开
-
二叉树路径总和系列问题
定义递归函数递归含义表示:从 node 节点一直到树的叶子节点,preSum 表示 node 之前的节点之和,target 表示目标值。主函数调用就是要的答案。接下来是递归函数的 base case,容易得到接下来是普遍情况,当前节点往右走,或者当前节点往左走,如果任何一个满足条件,就返回 true 表示满足,否则返回 false完整代码如下定义递归函数),如果满足条件,则找到一条满足条件的路径,使得结果之和等于目标值,此时 result 开始收集。原创 2023-12-26 16:27:47 · 148 阅读 · 1 评论 -
相同二叉树和镜面二叉树问题
普遍情况,首先要满足,left 树头节点的值和 right 树头节点的值一样,然后是 left 的左子树和 right 的右子树镜面对称,且 left 树的右子树和 right 树的左子树镜面对称,三个条件同时满足,left 和 right 才镜面对称。思路也很简单,首先,两棵空树是相同的树,只有一棵树是空树,则一定不是相同的树,即。即:如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。除此以外,两棵树的头节点的值相等,才有可能是相同的树。此外,左右子树同时为空的时候,是镜面二叉树。原创 2023-12-19 23:32:15 · 128 阅读 · 0 评论 -
链表K个节点的组内逆序调整问题
有了上述两个方法,我们可以比较方便实现原题要求,主流程如下。后面不够 6 个节点,所以返回。开始,数够 3 个,所以返回。的空间复杂度实现整个算法。方法也相对比较简单,就是。个位置后的那个节点。原创 2023-11-27 15:49:40 · 220 阅读 · 0 评论 -
反转链表系列问题
此时 cur 需要做如下操作:把 c , d, e 反转后的头节点获取到,假设为 pre , 在上图中,pre 就是 e 节点,然后 cur 再做如下操作。本题核心依然是反转链表,只是增加了一些变量来记录需要反转链表的头位置和结尾位置,不过需要注意的是,本题的链表开始位置是从 1 开始,所以,如果。该函数表示:反转以 head 为头的链表的前 n 个节点,并返回反转后的链表头节点。节点连接起来,所以递归过程中,需要一直记录反转的部分链表的后继节点,设置一个全局变量。个节点,并返回反转后的头节点,当。原创 2023-11-23 19:41:45 · 158 阅读 · 0 评论 -
算法和数据结构学习中的一些小的工具函数
如果 range 大于这个二进制值,则 num 个二进制位一定表示不了,则。区间中任意一个数 x 的出现的概率是 x,因为上述函数返回的结果要在。表示 num 个二进制位可以表示的最大数是多少,比如。情况下加速求区间和,如果数组可变,则需要使用。区间内才能符合要求,所以概率是。说明:在 Java 语言中,区间内,且我们使用的是。可以用下述方法进行测试。运行,可以得到结果对比。注:前缀和只适合数组。原创 2023-09-05 10:25:36 · 247 阅读 · 0 评论 -
动态开点线段树说明
按顺序遍历这个 arr 数组,最小值 2 被取出,其原始位置是 4,且 4 号位置右侧没有比自己更小的数,接下来在开点线段树中把把 4 号位置的值加1,表示 4 号位置被处理过了,在线段树中查4号位置以后并没有任何标记记录,说明没有比这个数更小的数了,直接设置4号位置的ans值为0。接下来是 1 号位置的 8, 在线段树中,查到右侧有三个标记过的,说明有三个比它小的数,直接在 ans 中把 1 号位置设置为 3, 然后在线段树中把 1 号位置标记为 1 ,说明处理过,此时。原创 2022-12-28 21:37:51 · 1425 阅读 · 1 评论 -
LFU 的设计与实现
此时只有出现一次的桶,接下来,如果 key = C 这条记录 被访问过了,所以词频变为2,接下来要把 key = C 这条记录先从词频为1的桶里面取出来,然后再新建一个词频为 2 的桶,把这个 key = C 的数据项挂上去,结果如下。接下来,如果又操作了 key = C 这条记录,那么这条记录的词频就是 3, 又需要新增一个词频为 3 的桶,原来词频为 2 的桶已经没有数据项了,要销毁,并且把词频为 1 的桶和词频为 3 的桶连接在一起。例如,LFU Cache 在初始为空的状态下,进来如下数据。原创 2022-12-27 21:50:34 · 520 阅读 · 1 评论 -
子数组的最大异或和问题
有了 eor 数组以后,对于任意 i 位置,0 到 i 区间的异或和就可以直接获取到了,接下来是枚举数组中任意两个位置 i 和 j 区间的异或和,由于。eor[2] 期待和它符号位一样为0的值,紧着高位(由于前面28都是0,所以不存在和它符号不一样的,只看最后4位,,整个过程比较简单,不赘述,基于这个暴力解法,可以有优化一些的算法,就是利用前缀异或和数组,时间复杂度可以减少到。当确定了 0 ~ i 位置的异或和以后,如何定位 0 ~ j 这个区间,使得 j ~ i 之间的异或和最大。(i > 0),所以。原创 2022-12-26 21:54:07 · 869 阅读 · 1 评论 -
字符串解码问题
递归含义表示,str 字符串从 from 开始一直到结尾或者右边括号生成的信息返回,返回值是一个长度为 2 的数组,例如。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。就可以,对于数字,要处理一个简单的边界条件,即数字不一定是单个整数,可能是多位数,比如。这个字符串,递归函数在执行过程中,遇到第一个右括号的时候,就会结算出两个信息,继续,后续没有]了,所以一直到字符串最后,得到最终的结果。输入:s = “2[abc]3[cd]ef”原创 2022-12-23 21:50:41 · 407 阅读 · 1 评论 -
最大正方形问题
在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。表示蓝色区域部分的正方形,基于上述上个位置的值,可以得到。本题思路比较简单,可以定义一个二维数组。,接下来是 base case,第一行和第一列的值很容易可以得到。周围的位置依赖,有如下两种情况。表示的区域是绿色部分的正方形,表示的区域是红色部分的正方形,的规模和原始矩阵的规模一样。有一个很显而易见的结论,如果。变量用于记录全局最大值。考虑普遍位置,如下图。原创 2022-12-12 18:57:03 · 485 阅读 · 1 评论 -
Dijkstra 算法说明与实现
注:Dijkstra 算法必须指定一个源点,每个边的权值均为非负数,求这个点到其他所有点的最短距离,到不了则为正无穷, 不能有累加和为负数的环。生成一个源点到各个点的最小距离表,一开始只有一条记录,即原点到自己的最小距离为0, 源点到其他所有点的最小距离都为正无穷大。代码说明:本题未采用题目给的二维数组的图结构,而是把二维数组转换成自己熟悉的图结构,再进行dijkstra算法。从距离表中拿出没拿过记录里的最小记录,通过这个点发出的边,更新源 点到各个点的最小距离表,不断重复这一步。原创 2022-12-10 18:10:27 · 673 阅读 · 1 评论 -
数组分成两个最接近集合问题
以上暴力递归可以改成动态规划,由于递归函数的可变参数有两个,一个是 i,一个是 rest,且其变化范围是固定的,所以可以定义一个二维数组来存所有的递归过程值,递归含义表示:数组 arr 从 i 开始,一直到最后,随意选取进行累加,得到的最接近 rest 且较小的集合的累加和。其中 p1 表示:不选取 i 位置的值进行累加,得到的最接近 rest 且较小的集合的累加和。表示:选取了 i 位置的值进行累加,得到的最接近 rest 且较小的集合的累加和。,否则选取之后,会得到较大的那个集合的累加和。原创 2022-12-09 21:47:47 · 964 阅读 · 1 评论 -
最大值减去最小值小于或等于 num 的子数组数量问题
达标,则 arr 中内部的任何一个子数组都达标;不达标,则 arr 扩充后肯定也不达标;根据题目意思,我们可以得到如下三个结论。利用滑动窗口算法,我们可以得到。完整代码如下(含对数器)原创 2022-12-08 16:14:08 · 841 阅读 · 1 评论 -
二叉树的最小(大)深度问题
结论是:如果Y左树的最右节点是 A(非 X ),Y 必定是第 9 层,如果 Y 左树的最右节点是 X,那 Y 在第 X 层数-Y 的左树的右节点的个数。给定一个二叉树,找出其最小深度,最小深度是从根节点到最近叶子节点的最短路径上的节点数量,说明:叶子节点是指没有子节点的节点。如果 head 的左树为空,则最小深度就是右树的最小深度加1(这里的加1就是包含头节点);如果 head 的右树为空,则最小深度就是左树的最小深度加1(这里的加1就是包含头节点);为头的二叉树的最小深度为多少。原创 2022-12-07 17:39:14 · 528 阅读 · 2 评论 -
二叉树最大路径和问题
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径 至少包含一个 节点,且不一定经过根节点。递归含义表示:head 为头的二叉树,得到的 Info 信息是什么。给你一个二叉树的根节点 root ,返回其 最大路径和。整合成以 head 为头的树的信息,路径和 是路径中各节点值的总和。其中以 head 为头的树的。,这种情况暗示左右子树汇报的。方法的实现,有如下几种情况。以上两种情况都可以归结为。以 head 为头的树的。接下来找左右子树的信息。,这种情况暗示右子树的。原创 2022-12-06 20:36:14 · 406 阅读 · 1 评论 -
纸条折痕问题
此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。递归含义表示:从第 i 次折叠后,纸条从上到下的布局是如何,其中 N 是固定参数,表示 N 次折叠,down 变量表示是否是凹折痕,初始状态调用。本题主要是发现整个过程的规律,假设中间分割线看成是一个二叉树的头结点,分割线的上方看成是左子树,分割线的下方看成是右子树,则有如下规律。表示:从第一次折叠开始,折叠了 N 次,纸条的状态怎么样。原创 2022-12-05 17:01:37 · 511 阅读 · 0 评论 -
求二叉树中最大的二叉搜索子树的头节点
作者:Grey原文地址:博客园:求二叉树中最大的二叉搜索子树的头节点优快云:求二叉树中最大的二叉搜索子树的头节点定义递归函数递归含义表示:以为头的二叉树中最大的二叉搜索子树的头结点是什么。接下来是 base case,定义一个辅助函数,这个函数表示:如果以为头的树是二叉搜索树,则返回其大小,否则返回 0。的实现思路也比较简单,即通过中序遍历收集以 head 为头的树,如果这个树满足二叉搜索子树,则返回二叉搜索子树的大小,如果以 head 的头不是二叉搜索树,直接返回 0。代码如下实现了如上方法,主函原创 2022-12-04 21:38:21 · 535 阅读 · 1 评论 -
判断二叉树是否为满二叉树
作者:Grey原文地址:博客园:判断二叉树是否为满二叉树优快云:判断二叉树是否为满二叉树使用公式,求二叉树的层数 k, 结点数 n,如果满足,则为满二叉树。定义数据结构其中表示二叉树的层数,表示二叉树的结点个数。定义递归函数递归含义是:head 为头的二叉树的层数和点数都是多少,接下来就是 base case即:的时候,此时, 且 接下来是普遍情况方法2定义如下数据结构其中表示是否为满二叉树,表示二叉树的高度。定义了这个数据结构后,可以梳理可能性,如果以 为头的树要符合满二叉树。则需要同时满原创 2022-12-03 17:23:26 · 1213 阅读 · 0 评论 -
加强堆结构说明
普通堆结构之所以无法做到,是因为普通的堆结构没有记录任意一个数据所在的位置信息,所以无法从对应的位置进行堆结构调整。这个方法表示,对于堆中任意的一个元素 obj,如果调整了其对应的数值,整个堆结构还能在时间复杂度。的时间复杂度可以将堆调整好,如果使用的是 Java 语言,可以用。)无法做到的,这就引入了「加强堆」的概念。但是,在实际场景中,有一种情况是:在已知的一个堆中,堆中。, 就可以很方便得到某个数据项在堆中的位置是什么,在堆的。操作中,涉及到的堆中两个元素的交换,也要把堆中元素的。原创 2022-11-29 19:44:31 · 495 阅读 · 3 评论 -
与堆和堆排序相关的问题
整个过程如下,以小根堆为例,从数组最后一个元素 X 开始,一直找其父节点 A,如果X 比 A 小,X 就和 A 交换,然后来到父节点 A,继续往上找 A 的父节点 B,如果 A 比 B 小,则把 A 和 B 交换……从最后一个元素 5 开始,5 的父节点是 2,正好满足,无需继续往上找父节点,然后继续找倒数第二个位置 4 的父节点,也比父节点 2 要大,所以 4 节点也不需要动。然后是 2 结点,2 结点的父节点 是 1 ,无需交换,然后是 1 结点,头结点,停止遍历,整个过程完毕。原创 2022-11-28 22:15:54 · 481 阅读 · 0 评论 -
基于桶的排序之基数排序以及排序方法总结
时间复杂度额外空间复杂度稳定性选择排序O(N^2)O(1)无冒泡排序O(N^2)O(1)有插入排序O(N^2)O(1)有归并排序O(N*logN)O(N)有随机快排O(N*logN)O(logN)无堆排序O(N*logN)O(1)无计数排序O(N)O(M)有基数排序O(N)O(N)有选择排序做不到稳定性,比如:5,5,5,5,5,3,5,5,5冒泡排序可以做到稳定性,在相等的时候,不往右即可。原创 2022-11-27 10:57:25 · 542 阅读 · 0 评论 -
基于桶的排序之计数排序
整个排序流程如下,首先获取到整个数组的最大值,假设是 max,则可以确定,数组中的所有数都不超过 max,所以,只需要开辟一个长度为 max + 1 的数组���假设为 helper,然后遍历原始数组 arr, 将。如果数组最小值是负数,假设最小值为 min,则把数组中所有的数加上(-min),就转换成了非负数组,最后排序结束后,再统一减去(-min)即可。这个排序适用于非负数数组,如果包含负数,需要先将负数转换成正数,处理逻辑如下。然后找 helper 中不等于 0 的值,,其中 M 是数组的最大值。原创 2022-11-26 19:02:33 · 357 阅读 · 0 评论 -
寻找链表相交结点问题
先从最简单的情况1和情况3进行分析,情况一发生的条件是:两个链表的入环结点(loop1,loop2)不是同一个,判断条件很简单,就是从任意一个链表的入环结点开始遍历一圈,如果都没有遇到另外一个链表的入环结点, 两个链表不相交,属于情况1;如果从任意一个链表的入环结点开始遍历一圈,遇到了另外一个链表的入环结点,则说明两个链表相交,属于情况3,且任意一个链表的入环结点都是相交结点。情况3:两个链表的入环结点不是同一个,此时任意一个链表的入环结点都是相交结点。首先,第三种情况下,两个链表一定不相交。原创 2022-11-25 20:37:14 · 399 阅读 · 0 评论 -
在链表上实现 Partition 以及荷兰国旗问题
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。第一种解法就是将链表先转换成数组,然后在数组上实现荷兰国旗问题,最后将数组还原为链表并返回,该方法的时间复杂度是。构造每个区域的链表的时候,还要考虑链表是第一次被构造还是已经构造了,以小于区域的链表为例,如果是第一次构造,则。解决了链表的荷兰国旗问题,那么原题中的链表 Partition 问题,就迎刃而解了。构造每个区域的链表的时候和上述荷兰国旗问题一样。原创 2022-11-24 20:02:33 · 561 阅读 · 0 评论 -
单链表的排序问题
将链表转换成数组,使用快速排序算法,然后把数组排序后的结果还原成链表。,本题参考了归并排序的迭代版本实现,归并排序算法的说明见如下博客。最后设置步长为 8,链表只有一个区间,直接排序,得到最后结果。这个思路的核心就是快速排序算法,快速排序算法见如下博客。步长超过或者等于链表长度,则整个链表排序完成。将如上区间内部排好序,得到的排序后的链表为。然后将上述区间内部先排好序,得到链表为。然后设置步长为 2,链表分成如下区间。然后设置步长为 4,链表分成如下区间。先设置步长为 1,链表分成如下区间。原创 2022-11-23 20:24:06 · 471 阅读 · 0 评论 -
奇偶链表问题
如果用辅助数组来做,非常简单,但是不满足题目的要求,因为题目要求空间复杂度 O(1),意味着不能额外申请辅助数组,换一个思路,考虑用一个整型变量来记录遍历的位置是奇数还是偶数,然后用四个指针分别记录当前奇数链表的开头,结尾;整个流程如下,遍历 cur 指针,同步记录 count,如果 count 记录的位置是奇数, 则构造奇数链表,如果 count 位置记录的是偶数,则构造偶数链表。如果偶数链表尾部不为空,则奇数链表一定不为空,且偶数链表的尾部就是变换后链表的尾部,即。,然后把奇数链表的尾部指针指向。原创 2022-11-22 22:12:32 · 181 阅读 · 0 评论 -
使用位运算优化 N 皇后问题
本文主要讲述了 N 皇后算法和位运算优化解法。原创 2022-11-20 19:23:56 · 444 阅读 · 0 评论 -
怪兽存活概率问题
根据上述暴力递归函数可以得知,递归函数的可变参数有两个,分别是 times 和 hp,且变化范围是固定的,可以定义一个二维数组 dp,表示所有的递归过程解。因为 G 位置求的时候,紫色部分格子已经求过了,补上一个 H 位置,就可以把 target 求出来,省略了枚举行为。的含义,即:怪兽还剩 hp 点血,每次的伤害在[0……M]上等概率的获得一个值,求 K 次打击之后,英雄把怪兽砍死的概率。给定3个参数,N,M,K 怪兽有 N 滴血,等着英雄来砍自己,英雄每一次打击,都会让怪兽流失,即为怪兽被砍死的概率。原创 2022-11-13 23:12:32 · 267 阅读 · 0 评论 -
二叉树中查找后继节点问题
作者:Grey原文地址:博客园:二叉树中查找后继节点问题优快云:二叉树中查找后继节点问题给定一个二叉查找树,以及一个节点,求该节点在中序遍历的后继,如果没有则返回 null题目链接见:LintCode 448 · Inorder Successor in BST思路一,利用中序遍历递归解法,使用 收集中序遍历的节点,然后遍历一遍 ,找到给定节点的下一个节点即可,中序遍历的递归方法代码很简单,参考二叉树的先,中,后序遍历(递归,非递归)。完整代码如下时间复杂度 ,空间复杂度 。同样,中序遍历可以使用迭代原创 2022-11-06 18:39:11 · 667 阅读 · 0 评论 -
二叉树的最大宽度系列问题
而且每次要记录上一层的最左位置 left,在一层结束时,记录一个最右侧位置 right,然后设置一个全局最大的 max,max 的更新策略就是。给定一个二叉树,你需要编写一个函数来获取这课树的最大宽度,二叉树的最大宽度是指具有节点数最多的那一层的结点个数。以一颗二叉树举例,如下示例图,以两个节点来说明封装的 AnnotateNode,虚线节点是 null 节点。,即:当前节点就是当前结尾位置的节点,则可以确定一层结束,更新全局 max,当前层节点个数归零,即。的个数,所以是不包括 null 节点的。原创 2022-11-05 19:47:53 · 548 阅读 · 0 评论 -
最大的观影时间问题
首先是 base case,由于是枚举所有可能的排列,所以,任意三场都可能出现在 0,1,2 位置上,所以,base case 就是。,表示当前电影的开始时间在 time 之后,且剩余要选择的电影大于 0,才能选。,表示正好不需要继续选电影,此时可以返回最大观影时间是 0, 否则,返回 -1 ,表示之前的决策有问题。首先,对电影进行排序,开始时间在前的排在前面,开始时间一样的,结束时间前的排在前面。的时候,可以结算此时的 0, 1, 2 的电影情况,计算出最大观影时间。表示没有电影可以选,此时,如果。原创 2022-11-04 21:06:38 · 564 阅读 · 0 评论 -
拼凑硬币问题
现有 n1 + n2 种面值的硬币,其中前 n1 种为普通币,可以取任意枚,后 n2 种为纪念币, 每种最多只能取一枚(可能有重复值),每种硬币有一个面值,问能用多少种方法拼出 m 的面值?即:只用 普通币完成 i 面值的组合数量是 M,用纪念币完成 money - i 面值的组合数量是 N,则 M * N 就是两者一起用组合成 money 面值的组合数量。根据递归含义,二维数组 dp 的第 0 列的值全为 1, 组成 0 面值的组合只有一种情况,就是用 0 枚普通币。也是返回一个二维数组 dp,原创 2022-11-03 12:19:37 · 259 阅读 · 0 评论 -
经典背包系列问题
来对上述递归过程进行优化,由于递归函数只有两个可变参数,所以可以定义一个二维数组 dp,二维数组的元素全部初始化为 -1,表示未计算过,用这个二维数组就可以存下所有的递归过程中间值,在递归函数中,如果 dp 的值已经计算过,直接返回即可。dp 的初始值全为 -1, 同时,将每次递归结果都存入 dp 中,如果某个递归算过了,则直接返回即可,完整代码如下。第二个决策,要当前物品,这个决策下,有一个限制条件,即当前物品大小不超过 rest,两个位置,根据这个依赖关系,可以将二维数组简化成一维数组,原创 2022-11-02 18:28:18 · 454 阅读 · 0 评论 -
纸牌博弈问题
作者:Grey原文地址:博客园:纸牌博弈问题优快云:纸牌博弈问题注:给定纸牌序列 A 及序列的大小 n,请返回最后分数较高者得分数(相同则返回任意一个分数)。保证 A 中的元素均小于等于1000。且 A 的大小小于等于300。题目链接:牛客-纸牌博弈定义两个递归函数,第一个递归函数是这个递归函数表示的含义是:先手在数组 A 的 start 到 end 范围内,经过 n 轮,能获得的最大的分数是多少。base case 是,当 的时候,即数组 A 只有一个元素,此时先手直接拿走这个元素,最大分数就是此时原创 2022-11-01 19:40:16 · 800 阅读 · 0 评论 -
贴纸拼词问题
接下来是普遍情况,枚举 stickers 中每一个字符串 s,将 s 中包含的所有字符从 target 移除掉,然后看 target 剩下哪些字符,继续被 stickers 中的字符分解。这个函数实现的功能就是:将 first 中包含的所有字符从 target 移除掉,然后看 target 剩下哪些字符,把剩下的字符按字典序排序后的结果字符串返回。注意:在所有的测试用例中,所有的单词都是从 1000 个最常见的美国英语单词中随机选择的,并且 target 被选择为两个随机单词的连接。有 n 种不同的贴纸。原创 2022-10-31 20:19:56 · 325 阅读 · 0 评论 -
Bob 的生存概率问题
的区域,Bob 处在 (i,j) 点,每次 Bob 等概率的向上、 下、左、右四个方向移动一步,Bob 必须走 k 步。由于最后的结果要返回最简的分数形式,所以假设有效路线是 X 种,所有可能的走法是 Y 种,那么返回的字符串是如下形式。递归含义表示:目前在 (i,j) 位置,还有 k 步要走,走完了如果还在棋盘中就获得1个生存点,返回总的生存点数。上述表示四面八方走返回的有效路线,四个方向的有效路线之和,就是答案,即。接下来是普遍情况, Bob 在棋盘中,可以往四面八方走,即。,即:4 的 k 次方。原创 2022-10-30 21:49:26 · 320 阅读 · 0 评论 -
象棋中的马跳步问题
根据上述暴力递归过程可知,递归函数有三个可变参数,分别是 a,b,step,每个参数都有一定的范围,所以可以利用一个三维数组 dp 来囊括所有的递归过程的中间结果。中国象棋中,整个棋盘就是横坐标上 9 条线、纵坐标上 10 条线的一个区域,给你三个 参数 x,y,k;接下来是 base case,首先 (i,j) 坐标如果已经越界,说明不可能有有效走法,直接返回 -1。,可以有一种走法(在原地不动),其他情况,都无路可走,返回 -1。,说明没有可走的步数了,此时,除非。暴力解法完整代码如下。原创 2022-10-29 21:17:54 · 591 阅读 · 0 评论 -
机器人到达指定位置的方法数问题
假设有排成一行的N个位置,记为1~N,开始时机器人在M位置,机器人可以往左或者往右走,如果机器人在1位置,那么下一步机器人只能走到2位置,如果机器人在N位置,那么下一步机器人只能走到N-1位置。表示第 0 列,然后根据依赖关系,通过第 0 列推出第一列的值,一维数组此时表示第一列的值,依次这样递推下去,一直到最后一列,得解,这种方法就可以将二维数组压缩成一维数组,节省了空间复杂度。所以,依据上述递归过程,可以改成严格位置的动态规划版本,完整代码如下。而且,通过上述动态规划解,可以得知第 0 列中,除了。原创 2022-10-28 21:09:39 · 387 阅读 · 0 评论 -
最长公共子序列问题
同理,如果 j == 0 且 i!则返回 1 ,表示最长公共子序列的长度就是 1, 否则则返回 0,表示最长公共子序列的长度就是 0,即。则返回 1 ,表示最长公共子序列的长度就是 1, 否则则返回 0,表示最长公共子序列的长度就是 0;如果 i == 0 且 j == 0,说明 str1 和 str2 只有一个字符了,此时,如果。如果 i == 0 且 j == 0,说明 str1 和 str2 只有一个字符了,此时,如果。情况 3,最长公共子序列既要 i 位置,也要 j 位置,此时,需要满足条件。原创 2022-10-26 20:38:55 · 228 阅读 · 0 评论 -
泡咖啡问题
每次做完一杯咖啡以后,弹出,记录下此时的时间存入结果数组,并且修改此时的咖啡机的开始工作时间,再次压入小根堆,然后小根堆弹出下一个元素,如此往复,一直到小根堆弹出 m 个元素。首先把所有咖啡机放入小根堆,第一个弹出的咖啡机是 CoffeeMachine{start=0, work=2}此时这个咖啡机的参数变为 CoffeeMachine{start=2, work=2}2 号人使用 CoffeeMachine{start=2, work=2} 咖啡机。把改变后的咖啡机放入小根堆,再次弹出一个咖啡机,此时。原创 2022-10-25 19:09:46 · 478 阅读 · 0 评论