力扣每日一题
文章平均质量分 62
力扣每日一题,如果我写得出来并且有时间就试着讲解一下
折途想要敲代码
_(:ι」∠)_好饿,但是不想动
展开
-
【力扣每日一题】2023.10.22 做菜顺序
我们逆向思考一下,我们一开始说满意度越高的菜我们越后面做,这个是没问题的,但是不利于我们做这道题,我们可以先假设我做满意度最高的菜,如果后面的菜我需要做了,我再反悔一下,我改成后面的菜变成第一个做的菜,而一开始先做的满意度最高的菜我改成第二个做的,这时我只需要将系数总和再加上满意度最高的菜的满意度就可以完成反悔的操作。给我们一个数组表示每个菜的满意度,我们可以指定做哪些菜以及做的顺序,需要我们凑到一个系数的最大值,系数的公式为 菜的满意度 * 轮到做完这盘菜所耗的时间包括等待时间。原创 2023-10-22 13:51:20 · 251 阅读 · 0 评论 -
【力扣每日一题】2023.10.19 同积元组
我们把题目换个说法,a*b=c*d 那就是两组乘积相同的数,所以我们就改为一共有多少两组乘积相同的数,得出来的结果需要乘8,因为abcd是可以调换顺序的,就算是同样的4个数,也会产生出8种不同的排列组合。所以我们两层for循环把数组中任意两个数都给乘一边,把每两个数之前的乘积的所有可能都获取到,用一个map来接收,键是乘积,值是乘积出现的次数。题目给的示例中的解释把答案的元组全列出来了,有些许的误导,实际上我们并不需要知道符合答案的元组是什么,我们只要求出元组数量即可。原创 2023-10-19 13:54:05 · 273 阅读 · 0 评论 -
【力扣每日一题】2023.10.13 避免洪水泛滥
如果某个湖泊下雨了,并且之前下过雨,我们需要“穿越”回去抽水了,现在从存放“时光机器”的容器里我们选择合适的日期穿越回去,最合适的日期就是这个湖泊第一次下雨之后的第一个没雨的日期,我们就挑选出比该湖泊第一次下雨的日期更大的第一个日期,由此可见,我们不仅要存储下雨的湖泊,还需要记录该湖泊下雨时的日期,所以回到刚刚的容器选择问题,存放下过雨的湖泊的容器我们选择map,键值就是下雨的日期。我们要抽的湖泊是下一个下雨且已经满了的湖泊,也就是这个湖泊已经下过雨了,并且下一个下雨的还是这个湖泊,这样就可以避免洪水了。原创 2023-10-13 17:21:18 · 210 阅读 · 0 评论 -
【力扣每日一题】2023.10.11 奖励最顶尖的k名学生
再给我们n个学生的评语,评语中有一个正面单词我们就加3分,有一个负面单词我们就减一分。大体思路就是我们直接模拟就好了,把每个评语的单词提取出,然后去寻找这个单词是否属于正面评价或是负面评价,对应的加分减分,最终按照题目要求排序即可。我们需要快速的知道某个单词是否在正面单词或是负面单词中,那么我们就可以先把两个存放单词是数组转为set来方便我们查找。下面的代码看着多,其实核心思路就是我上面这一小段,代码显得臃肿主要是我代码水平不到位,这道题其实是不难的。原创 2023-10-11 09:24:49 · 87 阅读 · 0 评论 -
【力扣每日一题】2023.10.10 移动机器人
上面动图的意思是一开始机器人1右走,机器人2左走,相遇之后机器人1改为左走,机器人2改为右走,如果是像这样模拟的话,每秒我们都需要将每个机器人都移动一次再进一步判断是否改方向,这样也是会超时的。首先先直接移动每个机器人,如果是右走,那么就直接在坐标加上秒数,如果是左走,那么坐标就减去秒数。如上动图我们可以知道,不做任何处理,并且我们不再区分机器人,在移动之后得到的坐标和最初做了碰撞处理之后的结果是一样的。可以看的出来,机器人两两之间的距离有很多是重叠的,我们在把相邻机器人之间的重复距离段给提取出来。原创 2023-10-10 20:18:05 · 170 阅读 · 0 评论 -
【力扣每日一题】2023.10.8 股票价格波动
另外要注意的是,我们不能使用set,我们需要使用multiset,因为不同时间的股票价格是可能会重复的,而multiset可以多次存放相同的元素。首先我们要获取股票的最大和最小价格,那么意味着我们需要对价格排序,我们要获取时间戳最大的数据,那么我们要对时间戳排序。这道题是程序设计题,要我们实现一个类,一共是四个功能,第一个是给一个时间戳和价格,表示该时间的股票价格,我们需要记录下这个时间以及对应的价格,如果之前已经记录过这个时间戳了,那么我们需要更新。三个获取的函数我们就搞定了,接下来是更新数据的函数。原创 2023-10-08 18:16:26 · 147 阅读 · 0 评论 -
【力扣每日一题】2023.10.7 股票价格跨度
这类题目我们使用单调栈来解决,我们使单调栈内的元素(股票价格)保持单调递减,每次我们将新一天的股票价格塞进单调栈之前,我们都把价格小于新价格的元素从栈中弹出,直到栈顶元素大于新价格,那么当天的价格跨度就等于从今天到栈顶元素那天的时间差。在塞入第一天的价格信息时,栈内是空的,我们很容易对空栈进行操作,所以我们可以在一开始塞入一个哨兵节点,也就是一个无穷大的值,这样在比较价格的时候就不可能将这个节点从栈中弹出了。实际上就是要我们找出数组中每个元素的上一个更大元素。原创 2023-10-07 16:09:19 · 170 阅读 · 0 评论 -
【力扣每日一题】2023.9.28 花期内花的数目
如果此时有人在时间为11时来的,那么我们找到的第一个大于来的人的时间的键值对是时间为13的,我们需要将找到的键值对再回退一格,回退一格之后的键值对的值才是来人时花开的数目。当完整的查找表在我们面前时我们就可以发现,实际上很多相邻的时间点的开花数是一样的,我们把第一个与相邻时间点不一样的时间节点提取出来。接着遍历所有来的人,根据来的人的时间,我们按照顺序去寻找在map中,键第一个大于来的人的时间的键值对。我们可以直接统计出在不同时间时,在花期内的花的数量,然后依次按照每个人来时的时间来获取花的数量。原创 2023-09-28 16:14:47 · 188 阅读 · 0 评论 -
【力扣每日一题】2023.9.27 餐厅过滤器
简单来说就是给我们一堆餐厅的信息,每个餐厅拥有五个属性,分别是id,评分,是否是素食餐厅,价格和距离。最后要我们返回符合条件的餐厅id,按照评分的降序排序,评分一致时按照id的降序排序。另外给我们三个过滤条件,分别是是否素食主义,最大价格和最远距离。所以我们最后对过滤后的餐厅做个排序之后再把id提取出来就可以了。因此前面要做的只是按照题目的要求把符合条件的餐厅过滤出来。如果是素食主义那么就只能进素食餐厅,反之可以进所有餐厅。另外只要价格和距离都没有超过最大的限制,那么也是可以的。原创 2023-09-27 13:38:26 · 264 阅读 · 0 评论 -
【力扣每日一题】2023.9.24 LRU缓存
put操作也需要我们找出缓存中是否有目标的键值对,如果有,那么我们更新这个键的值并且移动到缓存的最开头。如果没有,我们就添加这个键值对到缓存的开头,并且如果缓存的大小超过了限制大小,我们就把缓存的最末尾给丢掉。如果我用了一下锄头,但是工具里没有锄头,那么我从别的地方搞来锄头之后我就放在所有工具的最前面,如果工具数量超过最大限制了,那么就把最尾巴的工具扔掉。如果没有,那么我们直接返回-1。在get中,如果找不到对应键就返回-1,反之就把对应的键值对从链表中删除,再添加回链表开头,并且需要更新map中的记录。原创 2023-09-24 11:14:12 · 256 阅读 · 0 评论 -
【力扣每日一题】2023.9.23 树上的操作
寻找子孙节点的时候我们使用递归函数去查询,我使用的是DFS,找哪怕一个上锁的节点我们都返回true表示子孙节点有上锁的,但是我们不是立即返回,因为这个升级函数还要我们把上锁的子孙节点都解锁,因此我们还需要接着往下寻找子孙节点,遇到上锁的我们就解锁。第三个是升级函数,给我们节点值和用户ID,要我们把这个节点上锁,并且把这个节点的所有子孙节点都解锁。第二个是查询子孙节点,要求子孙节点至少有一个上锁,要用到节点的父子关系了,所以我们在构造函数的时候就构建出节点的父子关系,拿一个map来存放每个节点的子节点就行。原创 2023-09-23 10:57:36 · 189 阅读 · 0 评论 -
【力扣每日一题】2023.9.22 将钱分给最多的儿童
如果我们分完钱的时候,刚好给小朋友分到4元,那么我们需要避免这种情况,因此我们可以把4元拿回来1元,塞到另一个只分到1元的小朋友手上。如果其他没有拿1元的小朋友了,就把这1元塞给拿到8元的某个小朋友手上,此时拿到8元的小朋友数量就是原本小朋友数量-2。其他情况我们可以直接模拟,给每个小朋友都先分1元,然后还能给几个小朋友分7元,写成表达式就是(m-n)/7,刚刚上面给小朋友分到4元但是其他还有分1元的小朋友的情况也可以这么算出来。两个极端情况分析完,剩下就是不能给小朋友分4元。原创 2023-09-22 17:47:54 · 63 阅读 · 0 评论 -
【力扣每日一题】2023.9.21 收集树中金币
不过最后还有一个问题,那就是如果整个树都是可以移除的,那么根据我们刚才说的每删除一个节点就把答案-2,而我们答案初始化是总的节点数减1再乘2,这样答案就变成了-2,因此最后我们做个判断,如果答案小于0,我们就返回0,反之就正常返回求出的答案。我们收集金币的时候可以距离金币节点两格,因此我们可以再一次把图的外围两层节点删除,不过删除是有条件的,最外层的叶子节点可以直接删除,不过第二层的节点我们得判断删除了外层节点后,第二层的节点是不是叶子节点,如果是我们才可以删除。那么怎么删除呢,我们可没有构建出树来。原创 2023-09-21 11:18:13 · 233 阅读 · 0 评论 -
【力扣每日一题】2023.9.10 打家劫舍Ⅳ
我们用二分查找,首先需要确认左右范围,我们要找的数是数组中长度为k的子数组的最大值,所以范围就是整个数组的最小值和最大值,我们一次遍历就可以获取(用api调用获取也可以)。如果数量大于等于k,那么缩小右范围,反之缩小左范围,直到范围缩小到一个数,那么这个数就是我们要求的答案。寻找的话我们可以直接遍历整个数组,遇到不比范围中位数大的数我们就记录下来,然后把用于遍历的下标再加个1,表示不取相邻的元素。题目翻译有些烂,我来二次翻译一下,找出数组中k个两两互不相邻的数,求出它们的最大值。要求最大值尽可能小。原创 2023-09-19 16:50:30 · 254 阅读 · 0 评论 -
【力扣每日一题】2023.9.18 打家劫舍Ⅲ
最后就是具体的做法,我们要求一个节点的能获取的最大值,我们就需要知道它的两个子节点能获取到的最大值,因此我们使用递归去遍历二叉树,至下而上去递推。因为有两种情况,因此此时的dp数组应该是二维的,分别存放的是我选择当前节点所能获取的最大值以及我不选择当前节点所能获取的最大值。最终我们将根节点的能获取的最大值中(选择根节点能获取的最大值和不选择根节点能获取的最大值)取一个最大的返回出去。如果我选择当前节点,那么我能获取的最大值就是当前节点的值,以及左右两个子节点中不选择自己节点能获取到的最大值。原创 2023-09-18 12:30:16 · 336 阅读 · 0 评论 -
【力扣每日一题】2023.9.17 打家劫舍Ⅱ
在第一种情况之下,我们直接忽略最后一间屋子,然后按照打家劫舍1的方法算出答案,这时求出的答案是符合打家劫舍2的要求(房屋相连)的,因为房屋首尾相连唯一影响的就是首尾两个屋子不能同时偷到。但是dp2就不一样了,因为dp2是从第二个房屋开始算的,所以dp2[ 0 ]实际上等于下标为1的房屋的数值,因此dp2[ i ]的含义就是当遍历到下标为 i + 1的房屋时能获取到的最大答案。最终情况可以分为两种,第一种就是可以偷第一间屋子而不能偷最后一间屋子,第二种就是可以偷最后一间屋子而不能偷第一间屋子。原创 2023-09-17 10:03:17 · 288 阅读 · 0 评论 -
【力扣每日一题】2023.9.15 宝石补给
那就是分宝石时的数量是向下取整的,也就是如果宝石的奇数,那么分出去的宝石直接就是原本宝石数/2,不过自己剩下的宝石就不能直接/2了。而是应该为 n-n/2。今天的题目是纯模拟题,截止目前通过率有70%,是非常简单的。本来这种简单题是不想写题解的,不过有个细节值得说一说。原创 2023-09-15 07:24:30 · 159 阅读 · 0 评论 -
【力扣每日一题】2023.9.14 可以攻击国王的王后
所以我们可以从每个皇后的攻击范围中寻找国王,如果找得到,那么就表示这个皇后可以攻击到国王,不过这样会比较麻烦,而且如果在皇后攻击到国王的路径中有另一个皇后,那么这个皇后不能绕过另一个皇后去攻击国王,这样又多了不少判断条件。由于皇后不能绕过另一个皇后去攻击国王,因此我们在国王的每个方向上,只取离国王最近的皇后。因此我们从国王入手,正所谓你凝视深渊的时候,深渊也在凝视着你,如果一个皇后可以攻击到国王,那么就意味着国王也可以通过同样的攻击手段去攻击皇后。给我们皇后和国王的坐标,问我们哪些皇后可以攻击到国王。原创 2023-09-14 12:37:38 · 71 阅读 · 0 评论 -
【力扣每日一题】2023.9.13 检查骑士巡视方案
骑士在左右和上下两种方向之中,每次移动都是先移动一种方向两格,再移动另一个方向一格,那么每次移动的点是固定的八个点,因此我们只需要在这八个点中寻找元素等于当前所在格子的元素+1的位置,如果找不到,那么就表示骑士无法按照矩阵中的顺序去巡视。我们使用递归去寻找每个点,题目有说一开始骑士在左上角,因此我们从左上角开始递归,我们不断按照上诉的过程递归,直到我们把矩阵中所有格子都走一遍了,也就是递归了n*n+1次,那么表示骑士可以按照矩阵的顺序去巡视,我们返回true即可。原创 2023-09-13 12:32:03 · 421 阅读 · 0 评论 -
【力扣每日一题】2023.9.12 课程表Ⅳ
题目照例是给我们一堆课程的先修关系,然后问我们某课程是否是另一个课程的先修课程,或者是先修课程的先修课程。今天是课程表系列题目的最后一题,因为我在题库里找不到课程表5了,所以今天的每日一题就是最后一个课程表了。那我们只需要递归的去寻找目标课程的先修课程,直到找到对应的先修课程或者是把所有先修课程都找遍了也没找到。DFS和BFS都可以,我个人喜欢DFS,所以下面代码是DFS的。把问题换个问法,也就是在有向图中,一个节点能否走到另一个节点。如下图,B,C,D都是A的先修课程。原创 2023-09-12 13:06:53 · 202 阅读 · 0 评论 -
【力扣每日一题】2023.9.11 课程表Ⅲ
如果当前课程花费的时间加上我们所在的时间之后超过了结课时间,那么我们无法学习这门课程,不过我们可以贪心一下,如果这门课程花费的时间比我们学过的课程中花费最多的时间更少,那么我们可以选择不学那门花费更多的课程转为学习本门课程,因为我们是按照结课时间来排序,并且是按顺序遍历的,所以替换是不会发生冲突的。为了更方便地获取我们学习过的课程的最大花费,我们可以拿一个大顶堆来存放已经学习过的课程的花费时间,每次学习了课程,我们就把花费时间放进去,每次替换了学习的课程,我们就将大顶堆的堆顶元素推出,再把新课程塞进去。原创 2023-09-11 09:32:26 · 245 阅读 · 0 评论 -
【力扣每日一题】2023.9.10 课程表Ⅱ
我们跟昨天一样,首先先把有向图构建出,接着我们再模拟学习,模拟之前我们还需要拿一个数组来存放学习课程的顺序,以及一个set来记录学过的课程,其实数组和set里的元素是一致的,不过set更方便统计set中是否含有某个元素。每次学习我们都把所有课程遍历一遍,如果课程我们没有学过(不在set里),我们就遍历这门课程的先修课程,如果它的先修课程全部都在set中,那么我们本轮学习就可以学这门课程,把它添加进答案数组以及set中。今天的题目和昨天类似,不过今天要我们求出学习所有课程的先后顺序。原创 2023-09-10 09:48:19 · 543 阅读 · 0 评论 -
【力扣每日一题】2023.9.9 课程表
这道题和LeetCode75系列的第四十三题钥匙和房间很类似,不过不一样的是本题中题目没有告诉我们一开始学习的课程是什么,也就是说我们可以先学习所有没有先修关系的课程,然后再看看能不能学完所有的课程。构建完毕之后我们去遍历每个科目,再对每个科目用递归去寻找它们的先修科目以及先修科目的先修科目,如果找到了和自身一样的科目,那么就表示找到了图中的环,即我们不能学完所有科目。但如果我们递归到之前递归过的课程就认定有环的话,会把这种无环的情况也归为有环,因此就算我们递归到了之前递归过的课程也不能断定有环。原创 2023-09-09 11:02:24 · 179 阅读 · 0 评论 -
【力扣每日一题】2023.9.7 修车的最少时间
如果我们需要一个个去遍历所有可能是答案的时间的话,那么运行时间是非常恐怖的,因此我们需要用到一点小技巧去减少遍历次数,比较容易想到的办法就是二分查找法,有了范围的左右区间我们就可以使用二分查找法去寻找了,每次我们都取范围的中间数去看看,用这么多的时间可以修多少辆车,如果比我们需要修的车更多,那么我们就收缩右边界,反之收缩左边界,直到确定到答案即可。这道题和LeetCode75系列的第五十六题很类似,可以说是思路基本一致,感兴趣的小伙伴也可以去试着把那一题也去做一下,过几天我就会把那题的题解也发出来。原创 2023-09-07 19:27:51 · 321 阅读 · 0 评论 -
【力扣每日一题】2023.9.6 最深叶节点的最近公共祖先
由于最深节点的深度都是一致的,所以我们每次做替换为父节点操作之后,存放节点的容器里的所有节点还是在同一个深度。所以直到同一个深度上只有一个节点的时候,这个节点就是公共祖先了。不断遍历这个容器,每次都将容器里的节点替换为该节点的父节点,这代表往上寻找祖先,记得要去重,因为每个节点最多有两个子节点。我们一步一步剖析,我们先找出最深叶子节点,其实一棵二叉树上最深的节点一定是叶子节点,因为往下没有任何节点了。因为要往上寻找父节点,所以我们需要记录下每个节点的父子节点关系,这我们可以在层序遍历的时候一起记录。原创 2023-09-06 13:14:56 · 76 阅读 · 0 评论 -
【力扣每日一题】2023.9.5 从两个数字数组里生成最小数字
两位数的情况是两个数组没有共同拥有相同元素,那么我们要做的就是将两个数组的最小元素分别取出,要组成的数字最小,我们就将较小的数字作为十位数,而较大的数作为个位数。一位数的时候就是两个数组共同拥有同一个元素,那么我们组成的数字就是这个数即可,如果两个数组有多个共同拥有的数字,那么我们取最小的。题目给我们两个数字数组,要我们用这两个数组里的元素组成一个数字,这个数字里需要同时拥有两个数组里的至少一个元素。我实现的手段有两种,一种是用利用set自动对元素排序的特性,另一种是直接对数组进行排序。原创 2023-09-05 13:27:17 · 589 阅读 · 0 评论 -
【力扣每日一题】2023.9.4 序列化和反序列化二叉搜索树
我们知道,前序遍历和中序遍历对于二叉树的遍历顺序是一样的,都是先遍历左子树再遍历右子树,不一样的是,取节点值的时机不同,前序遍历是在一开始就去了当前节点的值,而中序遍历是在递归遍历完了当前节点的左子树之后才取的值。3的左子树就9一个节点,所以我们可以知道根节点的左子树节点的值就是9,那么问题在于右子树节点的值,有三个备选的值都在右子树上,那么哪一个值是根节点的右子树的根节点的值呢?因此前序遍历的结果的值的顺序就是我们递归二叉树的顺序,因为前序遍历一递归到节点就取值,因此前序遍历的第一个元素一定是根节点。原创 2023-09-04 19:32:33 · 525 阅读 · 0 评论 -
【力扣每日一题】2023.9.3 消灭怪物的最大数量
我们优先消灭的怪物是最快到达的怪物,所以我们可以把每个怪物到达城市所需花费的时间算出来,接着对花费时间从小到大升序排序,优先消灭靠前的怪物,不过我们并不需要知道具体是哪一只怪物,所以可以直接对存放花费时间的数组进行排序。题目比较长,我概括一下就是有一群怪物,每只怪物离城市的距离都不一样,并且靠近的速度也不一样,每次我们可以消灭一只,当怪物到达城市的时候我们就失败了,问我们最终可以消灭多少只怪物。不是,就算一个怪物离城市很近,但是它的速度比较慢,那也是对我们暂时没有威胁的。原创 2023-09-03 10:24:16 · 398 阅读 · 0 评论 -
【力扣每日一题】2023.9.2 最多可以摧毁的敌人城堡数量
我们可以套两层循环,第一层for循环去寻找1,如果找到了1,那么我们开始在当前下标往左右两边寻找最近的-1,并且统计0的数量,需要注意的是如果先碰到了1,那么表示我们无法落脚,也就不能更新答案,因为题目说的我们只能在-1的地方落脚,并且1到-1之间只能有0。在结束往右寻找的时候,我们可以把往右寻找的下标赋值给第一层循环的下标,因为我们结束往右寻找的时候,下标所在的位置要么是1要么是-1,赋值给第一层循环可以少遍历几次,不过题目中给的数据量比较小,所以这个小优化是可有可无的。原创 2023-09-02 10:29:56 · 345 阅读 · 0 评论 -
【力扣每日一题】2023.9.1 买钢笔和铅笔的方案数
例如示例一里的,买0根钢笔,最多可以买4根铅笔,所以当钢笔买0根的时候,有四种买笔的方案。我们一个for循环去遍历看看预算一共能买一根钢笔,然后再看看剩下的钱能买几根铅笔。题目给我们三个数,一个是我们拥有的钱,一个是钢笔的价格,另一个是铅笔的价格。直到买i根钢笔的价格大于预算了我们就停止for循环。题目的示例其实已经明示给我们解题思路了。我们先固定一个种类的笔,例如钢笔。问我们一共有几种买笔的方案。原创 2023-09-01 21:46:26 · 567 阅读 · 0 评论 -
【力扣每日一题】2023.8.31 一个图中连通三元组的最小度数
我的第一个想法就是使用map来构建图,然后遍历每个节点,再遍历每个节点的相邻节点,再遍历每个节点的相邻节点的相邻节点,如果节点的相邻节点的相邻节点是该节点,那么我们就找到了连通三元组,他们总体的度数-6就是连通三元组的度数。不过这么做就超时了,因为同一个三元组我们会重复遍历三次,每个节点我们都会遍历寻找包括它的连通三元组。题目给我们一个无向图,要我们找出三个节点,这三个节点他们两两相连,这三个节点除了连接到对方的其他线被称为连通三元组的度数,问我们图中最小的三元组度数是多少。原创 2023-08-31 08:59:01 · 458 阅读 · 0 评论 -
【力扣每日一题】2023.8.30 到家的最少跳跃次数
如果设置为了禁止点,那么如果后续递归中是往前跳跳到了这个点,那么本来是可以在这个点上往后跳的,但是由于设置为了禁止点,所以就会退出循环,这样就少了一种可能性,也就有可能会错失答案。然而是不可能是后跳到重复的点,因为不能重复后跳两次,能够后跳到这个点的地方,一定是前跳到那个地方的,也就是会被设为禁止点,那么也就不可能再重复后跳到同一个点了。题目给我们一只跳蚤,我们可以操控它前跳 a 格或是后跳 b 格,不能跳到小于0的位置,有一些被禁止的点不能跳到,也不能连续后跳两次,问我们最少跳几次可以让它回家。原创 2023-08-30 10:55:41 · 303 阅读 · 0 评论 -
【力扣每日一题】2023.8.29 带因子的二叉树
第一层遍历我们设下标为 i ,第二层下标为 j ,我们去寻找 arr[ i ] / arr[ j ] 这个元素在不在我们的map里,如果在,那么我们就把map里键为arr[ i ] 的键值对中的值加上以那两个乘数为根节点能形成的二叉树的数量的乘积,化简一下就是 m[ arr [ i ] ] += m[ arr[ i ] / arr[ j ] ] * m[ arr[ j ] ]。在遍历之前我们先做个预处理,我们用一个map来存住所有元素的值,以元素为键,值全部初始化为1。原创 2023-08-29 10:26:21 · 213 阅读 · 0 评论 -
【力扣每日一题】2023.8.28 插入区间
由于本题中原始数组就是按照左区间升序排序,因此我们可以做一个小优化,我们按照左区间升序的这样一个规则插入新区间,这样就不必再对数组进行排序从而减少运行时间了。我们只需要找到原始区间中第一个左区间大于新区间的左区间的区间即可,然后将新区间插入到这个区间的前面,接着再按照昨天的代码。和昨天的题大差不差,我们仍然是有一堆区间,题目给我们一个新的区间,要我们把新区间插入到原本的区间数组里,并且能合并的要合并。我们可以直接把新区间放入数组里,接着执行昨天的代码即可,一行都不用改,甚至形参名字都是一样的。原创 2023-08-28 00:18:00 · 212 阅读 · 0 评论 -
【力扣每日一题】2023.8.27 合并区间
第一种情况就是这样,第二个区间的左区间大于第一个区间的左区间但是小于第一个区间的右区间,并且第一个区间的右区间小于第二个区间的右区间,这种情况下合并的结果就是第一个区间的左区间和第二个区间的右区间组成一个新的更大的区间。第二种情况就是第二个区间的左区间大于第一个区间的左区间但是小于第一个区间的右区间,并且第一个区间的右区间大于第二个区间的右区间,这种情况下合并的结果就是第一个区间把第二个区间吞并。以上两种情况都是基于第一个区间的左区间小于第二个区间的左区间的,所以我们可以先对给的区间按照左区间进行排序。原创 2023-08-27 08:48:32 · 303 阅读 · 0 评论 -
【力扣每日一题】2023.8.26 汇总区间
由于汇总区间,我们需要得到的信息的左区间的数和右区间的数,所以我们需要两个变量来记录左右区间。我们拿一个变量来记录上一个元素是什么,如果当前元素等于上一个元素+1,那么连续,反之不连续。如果不连续,那么就是有了一个区间,我们把记录左右区间的变量做个比较,如果相同,那么直接把它们加入进答案,如果不相同我们就处理一下,在左右区间中间加个箭头再加入进答案中。题目给我们一个有序数组,让我们把数组内的元素汇总区间,也就是说有一串数字是连续的,比如是 1 2 3 4 5 ,那么我们就要汇总成"1->5"。原创 2023-08-26 10:16:25 · 281 阅读 · 0 评论 -
【力扣每日一题】2023.8.24 统计参与通信的服务器
如果数据量更大的情况,我们就可以进行一个优化,在遇到了同一列或是同一行的服务器时,我们将其位置修改为非1非0的值来表示这个位置是有服务器的,不过我们已经统计过了。这样在矩阵中遍历到这个位置时,就会因为这个位置的元素不为1而跳过,从而减少遍历次数。那么我们只需要遍历整个矩阵,遇到服务器的时候我们进入一个判断,如果同一行或是同一列中也有服务器,那么我们就认为这台服务器是参与通信的服务器,最后将统计结果返回即可。题目顾名思义,要我们统计参与通信的服务器,给我们一个二维矩阵,元素为1的位置则表示是一台服务器。原创 2023-08-24 09:53:04 · 534 阅读 · 0 评论 -
【力扣每日一题】2023.8.18 3n块披萨
我们再来处理一下数组首尾相连的问题,实际上数组首尾相连对我们有影响的是,不能同时取第一个元素和最后一个元素,因此我们的处理办法可以借鉴一下打家劫舍2,我们分两次动态规划,一次是假设我们没有第一块披萨然后动态规划,第二次是假设我们没有最后一块披萨然后动态规划。最后把两次的结果取一个最大值即可。意思是有i块披萨并且取j块披萨的情况下能获取的最大值为取本块披萨的值加上有 i - 2 块披萨并且取了 j - 1 块披萨的最大值以及不取本块披萨保持有 i - 1 块披萨且取了 j 块披萨的状态的二者的最大值。原创 2023-08-18 09:47:58 · 183 阅读 · 0 评论 -
【力扣每日一题】2023.8.17 切披萨的方案数
题目要求每块披萨都需要有至少一个苹果,那么我们就应该要单独去统计一下苹果的分布情况,因为披萨的右下角是会一直留下来的,因此我们可以用一个二维矩阵来存放苹果的分布情况,这个矩阵坐标为 [ i , j ] 的元素就是披萨中 [ i , j ] 位置的右下角中拥有的苹果数。最终填完dp数组之后,根据dp数组的含义,我们返回dp[ 0 , 0 , k-1 ] ,意思就是在披萨[ 0 , 0 ]的位置,我们可以切k-1刀的数目,也就是题目要我们返回的答案。因此突破口应该在披萨的右下角,也就是矩阵的右下角。原创 2023-08-17 10:37:07 · 153 阅读 · 0 评论 -
【力扣每日一题】2023.8.16 找出转圈游戏输家
我们拿一个set来统计已经接过球的玩家,然后循环模拟传球,一旦有人接到了两次,那么我们退出循环。最后通过set来统计一下有哪些玩家没接过球,把他们放入一个容器里返回。题目比较长,概括一下就是类似击鼓传花的游戏,如果有人接到了两次球,那么游戏结束。没接到球的玩家失败,让我们返回失败的玩家的列表。那么这是一道简单的模拟题,我们直接无脑模拟即可。原创 2023-08-16 08:46:16 · 67 阅读 · 0 评论