【Fifty Project - D37】

fifty project算是失败了一半了

成功的那一半在于一定程度上拯救了我的作息和健康,两个月前入职体检的肝有点不健康,昨天复查发现全都回到了健康范围!尿酸也在正常范围!就是体重还是没减下来hhh

失败的一半在于自己很差劲的规划能力依旧差劲,每天还是喜欢根据喜好进行学习,往往就变成了刷题日记了

不管怎么说,经历过就很棒!加油加油加油!

今日完成记录

Time Plan 完成情况
17:30 - 19:30 🏸
20:00 - 21:30 Leetcode

Leetcode

上周完成的周赛少有地拿下了三个题,上了一波大分【和Knight的距离有更近了!】,第四题本来也有机会拿下的QAQ,是既熟悉又陌生的树上倍增算法,这个方法怎么也是写了又写,学了又学,思路也大致都对,就差一丢丢!昨天把那个压轴给复盘了一下,今天重新打开灵神的常用数据结构题单,继续堆部分的题目咯。

今天的刷题感觉收获颇丰! 懒删除堆和字典树计数
滑动窗口中位数:给一个数组,要求计算大小为K的滑动窗口中的中位数

思路:因为是在对顶堆的题目里面,所以上来就有思路了,拿一个最大堆存较小的一半数,拿一个最小堆存较大的一半数,然后每次从堆顶计算中位数。麻烦的地方在于滑动窗口出窗口的数要如何进行删除。我的思路是用两个hashSet记录两个堆存储过的数字的下标,然后利用hashset懒删除【这也算一种比较呆的懒删除吧hhhh】后来学习了灵神的懒删除【用一个hashmap记录堆中数字需要删除的次数,当push数字的时候检查一下是否有删除次数,有的话直接修改删除次数相当于删除了;另外,在每次pop或者peek都得进行一次堆顶的实际删除,也就是检查堆顶元素是否删除次数为0】

灵神的代码将这个堆封装了一层,优雅不少~

含最多k个可被p整除的子数组:给定一个数组以及K和P,要求统计有多少个子数组【数组中任意长度的连续数】,其中包含最多k个可以整除P的数。要求做到O(n^2)

思路:一开始想了个O(n)的解法,但是没注意到不同子数组这一点,就是可能出现两个子数组选取的数下标是不同的但是数都是一样的,例如数组2,3,3中长度为1的子数组有【2】、【3】、【3】但其中后两个视作同一个子数组。

简述一下这个O(n)做法:首先将这个数组根据能否整除p变成0和1【能整除则为1不能则为0】,然后计算前缀和数组,并且记录每个前缀和首次出现的位置(实际上就是能整除p的数的位置),pre[i]表示从i到数组最初,共有pre[i]个数能整除p。那么对于每个位置,以当前位置为结尾的符合条件的子数组数量有pre[i] <= k ? i + 1 : i - first[pre[i] - k]。累加即可得解。

正解是:我回头看了一眼这个题目是哪个题单,发现居然是字典树题单,瞬间幡然醒悟,居然是用字典树进行计数!!从每个数开始向后遍历构造子数组,只要当前子数组依然符合要求就继续构造。同时用字典树存储当前方案。最后统计这颗字典树有多少个节点即可!【实际上在构造过程中就可以统计出来】

灵神大佬说过的如何评价做题是否有效,当想不出思路看了题解之后,如果是脑瓜子嗡的一下,"还能这样!"那就是有用的,如果是"我真是个XX"那说明还得练hhhh

应该是自己刷题少了,字典树计数确实好像没遇到过emmmm

收获颇丰~

相关推荐
好易学数据结构1 小时前
可视化图解算法52:数据流中的中位数
数据结构·算法·leetcode
吃着火锅x唱着歌2 小时前
LeetCode 632.最小区间
算法·leetcode·职场和发展
迪小莫学AI3 小时前
【力扣每日一题】划分数组并满足最大差限制
算法·leetcode·职场和发展
CodeWithMe4 小时前
【Leetcode】每日一题 —— No.2966
算法·leetcode
圣保罗的大教堂18 小时前
leetcode 2566. 替换一个数字后的最大差值 简单
leetcode
剪一朵云爱着18 小时前
力扣面试题 17.05. 字母与数字
算法·leetcode
wen__xvn19 小时前
九日集训第三天
数据结构·算法·leetcode
dying_man19 小时前
LeetCode--33.搜索旋转排序数组
算法·leetcode