- 博客(62)
- 收藏
- 关注
原创 Day 26:哈希 + 双指针
因为取决于的是更小的柱子,跟盛水不一样,盛水取决于高的柱子。所以就相当于在l和r遇到的地方有一个很高的柱子,但是它不会比l_max和r_max小。对于单向的遍历,那向左遍历举例,我们假设右边有一个很高的柱子能把水留住,那么能接住多少水只取决于左边的最大值。有一点贪心的思想,用while简化了两个for循环,因为我们每次都取更长的板,那种可能会让结果更小的可能性我们就不考虑了。这一题是盛水容器的高级版本,建议下一次遇到还是用双指针做,动态规划需要维护正向遍历和反向遍历两个数组,短时间内是想不出来的。
2025-03-30 22:24:42
325
原创 Day25:不用加减乘除做加法 + 构建乘积数组 + 二叉搜索树最近公共祖先
中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(请不使用四则运算符的情况下实现一个函数计算两次通信的数据量之和(三种情况均需被统计),以确保在数据传输过程中的高安全性和保密性。例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]为了深入了解这些生物群体的生态特征,你们进行了大量的实地观察和数据采集。个生物群体的数量从总体中排除后的其他数量的乘积。
2025-03-29 00:22:30
374
原创 Day 25:股票的最大利润 + 1到n求和
注意这是一个只能进行加法操作的程序,不具备乘除、if-else、switch-case、for 循环、while 循环,及条件判断语句等高级功能。在第 3 天(芯片价格 = 2)买入,在第 4 天(芯片价格 = 9)卖出,最大利润 = 9 - 2 = 7。请设计一个算法计算并返回你从这笔交易中能获取的最大利润。请设计一个机械累加器,计算从 1、2... 一直累加到目标数值。记录了某芯片近期的交易价格,其中。如果你不能获取任何利润,返回 0。但是条件判断不能用,没有递归出口。很标准的动态规划题目。
2025-03-28 22:33:16
289
原创 Day25:扑克牌中的顺子 + 圆圈中最后数字
位文物的所属朝代编号。其中,编号为 0 的朝代表示未知朝代。请判断并返回这排文物的所属朝代编号是否能够视为连续的五个朝代(如遇未知朝代可算作连续情况)。展览馆展出来自 13 个朝代的文物,每排展柜展出 5 个文物。某排文物的摆放情况记录于数组。
2025-03-28 13:56:49
196
原创 Day24:队列的最大值
科技馆内有一台虚拟观景望远镜,它可以用来观测特定纬度地区的地形情况。该纬度的海拔数据记于数组。然后队头是要维护最大值的,所以如果不大于队头的元素会从队尾出去。滑动窗口的位置 最大值。表示对应位置的海拔高度。请找出并返回望远镜视野范围。首先队列里保存的是数组索引,方便比较窗口长度。注意一下出队的条件。这个题写过一遍就不难。内,可以观测到的最高海拔值。选择用一个双端队列来维护窗口。
2025-03-26 23:58:05
306
原创 Day24:翻转字符串
你在与一位习惯从右往左阅读的朋友发消息,他发出的文字顺序都与正常相反但单词内容正确,为了和他顺利交流你决定写一个转换程序,把他所发的消息。中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。公司门禁密码使用动态口令技术。请返回更新后的密码字符串。
2025-03-26 22:27:09
300
原创 Day23:和为s的数字
待传输文件被切分成多个部分,按照原排列顺序,每部分文件编号均为一个。(至少含有两个文件)。传输要求为:连续文件编号总和为接收方指定数字。请返回所有符合该要求的文件传输组合列表。请在购物车中找到两个商品的价格总和刚好是。购物车内的商品价格按照升序记录于数组。若存在多种情况,返回任一结果即可。[27,34] 或者 [34,27]二分查找法(纯粹想练一下二分查找)[3,15] 或者 [15,3]
2025-03-26 21:19:01
202
原创 Day23: 数组中数字出现的次数
表示该袜子的颜色编号。礼盒中除了一款撞色搭配的袜子,每种颜色的袜子均有两只。请设计一个程序,在时间复杂度 O(n),空间复杂度O(1) 内找到这双撞色搭配袜子的两个颜色编号。我们再来看这个题目,肯定还是用位运算,只不过当所有的数两两抵消之后,我们会留下这一对数。空间复杂度O(1),不能再用哈希表了,时间复杂度O(n),要求一次遍历就把这对找出来。,除了某个元素只出现一次以外,其余每个元素均出现两次。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。[2,5] 或 [5,2]
2025-03-23 00:08:04
433
原创 Day22:二叉树的深度
上面示例中的二叉树的最大深度是 4,沿着路径 1 -> 2 -> 3 -> 4 或 1 -> 2 -> 5 -> 4 到达叶节点的最长路径上有 4 个节点。某公司架构以二叉树形式记录,请返回该公司的层级数。此树的深度和其左(右)子树的深度之间的关系。更快的算法:后序遍历。
2025-03-21 21:51:43
304
原创 Day21:在排序数组中查找数字
我们发现如果这个元素的下标不等于其本身,就有问题,[0]开头的这种单独处理。某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组。某班级考试成绩按非严格递增顺序记录于整数数组。假定仅有一位同学缺席,请返回他的学号。在已经排好序的数组里查找,无脑二分查找。要看看边界是否要扩张(收缩)递归的条件判断不要写错。循环不递归,递归不循环。
2025-03-21 00:20:03
245
原创 Day 21: 数组中的逆序对
我们会发现在归并排序的过程中都会比较两个子序列中两个数的大小,在合并两个子序列的过程中,右边的数组指针指向i项,比左边的元素小,由于左右子序列都是已经排好序的了,那么右边数组就有i项比左边现在这个元素小,也就是有i个子序列。很多细节没注意到,一开始写成i > left导致总是漏掉最小元素的逆序对,我觉得还是归并的熟练度不够。交易中的逆序对为 (9, 7), (9, 5), (9, 4), (9, 6), (7, 5), (7, 4), (7, 6), (5, 4)。,返回其中存在的「交易逆序对」总数。
2025-03-20 17:48:43
386
原创 Day21:两个链表的第一个公共节点
记录了两套核心肌群训练计划,节点值为训练项目编号。两套计划仅有前半部分热身项目不同,后续正式训练项目相同。请设计一个程序找出并返回第一个正式训练项目编号。如果两个链表不存在相交节点,返回。如果程序能够正确返回相交节点,那么你的解决方案将被视作正确答案。- 相交的起始节点的值。如果不存在相交节点,这一值为 0。程序将根据这些输入创建链式数据结构,并将两个头节点。中(从头节点开始)跳到交叉节点的节点数。中(从头节点开始)跳到交叉节点的节点数。- 第一个训练计划链表。- 第二个训练计划链表。
2025-03-20 16:32:00
160
原创 Day20:丑数
dp[i] 代表第i个丑数,dp[1] = 1;设置三个指针p2,p3,p5用来代表当前元素乘以几,dp[i] = min(dp[p2]*2,dp[p3]*3,dp[p5]*5),如果使用了指针,就得++;应该这样,把1加进去,然后,1的2,3,5倍加进去,然后1出队,就这样一直出队并把堆顶的2,3,5倍加入,用一个Set接收,如果成功接收,index++,等index等于n的时候,返回。首先使用最小堆来做这个题目,因为2,3,5是丑数,那么2x,3x,5x也是丑数,我们使用一个set去重就行了。
2025-03-19 23:57:42
299
原创 Day20:最长不含重复字符的子字符串
因为连续且最长的招式序列是 "dbascD" 或 "bascDd",所以其长度为 6。因为连续且最长的招式序列是 "wke",所以其长度为 3。没写出来,二刷重温,思路被好几种方法搞的有点乱。中最多可以出连续不重复的多少个招式。而 "pwke" 是一个非连续的。因为无重复字符的最长子串是。的概念:你的答案必须是。某套连招动作记作序列。,所以其长度为 1。动态规划&&滑动窗口。
2025-03-19 17:37:47
212
原创 Day20:礼物的最大价值
第一遍写的时候忘记初始化第一行和第一列导致第一次写出错了,dp数组要保证填满来保证递归的合理性。优化是把二维换成一维。可以同一时刻只需要存储最后两行的状态,即使用两个长度为 n 的一位数组代替 m×n 的二维数组 f,交替地进行状态转移,减少空间复杂度。注意:珠宝的价值都是大于 0 的。除非这个架子上没有任何珠宝,比如。为该位置珠宝的价值。现有一个记作二维矩阵。
2025-03-19 11:33:05
237
原创 Day19:把数组排成最小数
这个题目我第一次有一个想法,首先我们把所有数字自动填充成跟数组里位数最高的一样的,填充用最后一位,比如8变成88,7变成77,如何比较最高位,最高位越小,则越优先选。但是这样遍历的幅度非常大,很麻烦。所以我想先排序,再实现。请编写一个程序返回这个密码。
2025-03-18 21:47:36
198
原创 Day19:数据流中的中位数
这题难点在于要想到用两个堆,小顶堆的所有元素都大于大顶堆的元素,并且小顶堆的堆顶和大顶堆的堆顶就可以得到中位数。如何维护这两个堆是关键,我们首先先把一个元素放到 最大堆,然后把最大堆的最大元素放到小顶堆,如果小顶堆size大于大顶堆,就把小顶堆的堆顶给大顶堆。最后返回顶堆元素即可。是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。这种题目做过一次有思路再做就很快。如何选取合适的排序算法很重要。
2025-03-18 17:06:58
191
原创 Day 18:数字 1 的个数
我们设定当前位为cur,比如511322,当前位为3 ,那么我们不难发现,当前位为1时,个数有511*100种。如果当前位为1,那么只有510*100+1*22种,当前位为0时,后三位为022,比100小,那么就只有511种。我们依次遍历这个数的各个位就行了。有点考研数学,做过一遍就会了。暴力求解:复杂度太高。参考那种滚轮密码锁。
2025-03-17 23:52:31
217
原创 Day17:连续子数组的最大和
首先我们思考这题能不能用动态规划写,要求连续子数组的最大值,那如果我在取这个子数组的过程中每一次都取最大值,是不是就可以了呢。所以 dp[i] = Math.max(dp[i-1] + nums[i],nums[i])如果不取:则 dp[i] = nums[i](相当于从这个元素作为子区间的新起点,重新算起)如果取:则 dp[i] = dp[i-1] + nums[i][5,4,-1,7,8] 此连续五天的销售总额最高,为 23。[4,-1,2,1] 此连续四天的销售总额最高,为 6。
2025-03-16 23:25:54
313
原创 Day16:最小的k个数
我们把最左端定为哨兵,也就是说最后的位置左边必须比哨兵小,右边必须比哨兵大。首先收缩边界,然后交换,最后的情况是right指着最后一个小于或等于。快排的核心全在partition算法里,本质是确定分区点,每一次分区就代表这个元素被排好了。首先考虑用TreeSet来实现这个代码,因为TreeSet会基于红黑树自动帮我们排序。下面改用快排,快排的时间复杂度为O(n),刚好复习一下快排的代码。我们分析一下改怎么写,如何确定最后return的是左边还是右边。很明显,不合适,因为Set集合会去重。
2025-03-15 23:50:03
249
原创 Day16:数组中出现次数超过一半的数字
用一个桶,遍历数组,出现一次就++,大于1/2说明只可能有一个数字,每次++的时候检查一下是否超了,如果超了,直接return就行。请返回库存表中数量大于。形式记录商品库存表。
2025-03-15 21:42:41
204
原创 Day16:序列化和反序列化一个二叉树
这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。思路,序列化通过层序遍历得到层序遍历序列,反序列化就通过序列构造二叉树。2,反序列化的队列一样是树节点的队列。1,序列化的字符串最好是这种样子,不然后续很不好搞。4,注意index的值。
2025-03-15 21:14:59
333
原创 Day16:二叉搜索树和双向链表
此题的重点在于一开始的时候想到要用一个节点代表前驱,方便我们在遍历过程中找到前驱节点。首先我们要把二叉搜索树转化为一个序列,按照这个来看,左子树为前驱,右子树为后序,那就是一个中序遍历。然后把这个中序遍历转化为双向链表即可。对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。
2025-03-15 17:10:28
239
原创 Day16:复杂链表的复制
总而言之思路就是先复制链表,然后存random关系于哈希表,第二次根据哈希表设置random,重点是要注意不要把新链表的random指到原链表上。解决办法:在第一次遍历时,将原链表的节点和新链表的节点存储在。函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个。指针指向原链表的节点,而不是新链表的节点。中,以便在第二次遍历时能够正确设置。指针,但在新链表中,试图直接从。指针指向下一个节点,还有一个。指针指向链表中的任意节点或者。中存储了原链表的节点和它们的。
2025-03-15 16:24:31
344
原创 Day15: 二叉树中和为某一值的路径
DFS的变体,我的思路就是用一个results存最后的结DFS循环,新建一个result,从root出发,不断累加,到叶子节点时如果累加达到target,就把result放进大集合里。写DFS时遇到的一些问题:第一,容易忘记创建新集合,不创建新集合的话,回溯后返回的就是空的集合。第二,必须要回溯,因为你不回溯,所有的递归调用共享同一个。中,导致后续路径中包含了不应该存在的节点。第三,参数要记得传递。路径总和等于给定目标和的路径。当前节点会一直保留在。是指没有子节点的节点。
2025-03-14 01:20:41
210
原创 Day15:二叉树的后续遍历序列
是否为二叉搜索树的后序遍历结果。从上图可以看出这不是一颗二叉搜索树。请实现一个函数来判断整数数组。要注意函数调用的边界。
2025-03-14 00:00:56
312
原创 Day 14: 从上到下打印二叉树
为什么这样能保证在队列里的元素就是一层的元素呢。因为我们在上一次循环的过程中就已经保证下一层所有节点加入到队列了。我们在for循环中把上一层的节点全部去除,那么在每一次while循环开始前队列的长度就是每层的长度。这个题目是层次遍历的另一种写法,我建议记这种,因为涉及需要跟层数相关的时候好操作。的二叉树,节点值为该位置装饰彩灯的颜色编号。这个题目就不是简单的层次遍历了,需要记录层数了。这个题目跟上面那个差不多,就是要之字形输出。的顺序返回每一层彩灯编号。一棵圣诞树记作根节点为。
2025-03-12 23:54:36
359
原创 Day14:栈的压入、弹出序列
每次加入元素的时候,循环判断栈顶元素是不是等于索引元素。(不加这个循环的话无法连续出栈)然后如果找不到索引元素,说明还没加进来。如果序列不对会出现元素在栈里但是找不到栈顶元素的情况。这个时候就说明序列错了,此时栈不为空。是否为按照正确的顺序拿取书籍的操作序列。你可以假设放入书架的所有书籍编号都不相同。现在图书馆有一堆图书需要放入书架,并且图书馆的书架是一种特殊的数据结构,只能按照。给定一个表示图书放入顺序的整数序列。很巧思,建议多画图然后记住题目。
2025-03-12 22:29:45
312
原创 Day14: 包含min函数的栈
比较的是对象的引用,而不是值。如果栈中的元素是通过自动装箱(autoboxing)生成的。操作,并能在常数时间内检索到最小元素的栈。:对于对象类型的比较,应该使用。
2025-03-12 21:13:09
250
原创 Day14:顺时针打印矩阵
对于单行和单列的矩阵,你第一个循环把第一行或者第一列遍历完,但是后续的三个循环还是会执行,比如{{2,3,4,5}这个单行矩阵,第一个循环结束是2345,然后第二个循环不执行,第三个循环就会从endY = 3 开始遍历如果我们限定数组长度就会生越界。这是我第一遍写的代码,数组边界搞懵逼了好几次,这个题目还是需要搞懂数组边界情况。然后这个代码在遇到{[2,3]}这种单列矩阵的时候报错了。提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。这是一个循环嵌套循环的问题,需要理清楚再写。
2025-03-12 16:18:26
286
原创 Day14: 对称的二叉树
剑指offer给出的是前序遍历对称二叉树,以及得到逆前序遍历来求解,我觉得这个方法更快。第一遍写的时候忘记克隆原来的树了,树如果不创建新树的话基本上都是对原来的树进行操作。root1.val!= root2.val而不是root1!本质上就是前序遍历的拓展,但是这里有一个地方写错了。比较两个节点的时候应该是。我的想法是直接镜像,如果轴对称,肯定镜像后是一样的。请设计一个函数判断一棵二叉树是否。
2025-03-12 15:05:50
279
原创 Day13 二叉树的镜像
而且还有一个地方需要注意,就是返回root的条件必须是左右都为空才可以,如果只有一边为空我们还是执行交换。第一遍写的时候7和9换过来了,但是左右两个大子树没有换过来,原因在于只换了值没有换节点导致的。做一个递归,存一个temp值,递归交换两个节点。注意要考虑空节点的情况。,请左右翻转这棵二叉树,并返回其根节点。给定一棵二叉树的根节点。
2025-03-11 22:33:32
232
原创 Day13:树的子结构
首先AB不能为空,这个可以单拎出来,然后就是要么A的左子树有B,要么A 的右子树有B,当有B的时候,我们做是否匹配的判断。首先递归肯定是要有一个出口的,在第二个函数里面递归的出口要注意有两个。树的递归:出口,满足什么条件要返回,比如查找,查找到了,返回true。第一遍写的时候把主函数里的if写成else-if结构了,如果if里面的代码跑通,是会直接返回不会检查左右子树的。初步思路是选取两个指针,首先我们找树2的根节点,然后依次左右,如果有一个不一样我们就返回false.的某个节点为根的子树具有。
2025-03-11 22:10:55
297
原创 Day13: 合并两个排序链表
我们在两个链表上各设立指针,如果有一个为空我们就返回另一边。然后我们比较两个指针索引的大小,并且不断递归。这个递归是怎么想到的呢?我们每次合并的步骤做的都是一样的,并且返回的都是节点。那么我们在选取下一个节点递归调用这个函数就行了。,分别记录了两套核心肌群训练项目编号,请合并这两个训练计划,按训练项目编号。:新链表是通过拼接给定的两个链表的所有节点组成的。
2025-03-11 21:09:42
168
原创 Day12:链表中环的入口节点
但是整个循环结束的时候fast == null,如果链表没有环,那么空指针也就没有next和next.next,就会报空指针异常。我的思路是用HashSet来解决,单向遍历链表,把节点存到哈希集合里,如果出现重复,说明有环路,而且你检查到的地方就是入环的地方,同时要考虑代码的鲁棒性。使用快慢指针(双指针)的方法,来解决这个问题。当快慢指针相遇后,重新初始化一个指针指向链表头,然后让这个指针和慢指针一起移动,直到它们相遇,相遇点就是环的入口节点。给定一个链表,返回链表开始入环的第一个节点。
2025-03-10 23:21:18
153
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅