【Leetcode Daily】295数据流的中位数
发表于|更新于|力扣日常 | LeetcodeDaily
|总字数:331|阅读时长:1分钟|浏览量:
题目浅析
想查看原题可以点击题目链接。
简单地说,就是在给数组增添数字的过程中,可能需要随时输出当前的中位数。
思路分享
构建大小堆,也就是一个大顶堆和一个小顶堆,前者相当于当前数字的左侧,后者相当于右侧,这样就能随时得到左边最大和右边最小的数值,也就方便计算中位数了。
具体而言,需要保证两点,第一是优先把数字放左侧,随后如果左侧的数字更多,再放右边;第二保证左侧的所有数字都小于右侧,所以如果要加到左侧的数字,可以先加到右侧,再从右侧获取最小的数字加到左侧。
代码解答(强烈建议自行解答后再看)
- 参考题解
1 | class MedianFinder: |
文章作者: 陆爻齐-LuYaoQi
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LuYaoQi's Blogs!
相关推荐

2025-09-07
【Leetcode Daily】2558从数量最多的堆取走礼物
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个数组,并重复 k 次找其中最大的数字平方再放回去,返回最后数组的数值和。 思路分享 对于这种找最大/最小的情况,可以考虑堆。堆会自然维护堆顶为所有元素的最小或者最大,并且在去除这个最值后,也能很方便地提取出下一个最值。 那有人可能就问了,之前学的单调栈和单调队列不也能方便地取最值吗,为什么不用?原因是单调栈和单调队列的维护效率不及堆,在本题,提取的最值处理后又要放回去,提取是方便,但放回去的最坏情况是O(n),即从最大值变最小值。 https://leetcode.cn/problems/take-gifts-from-the-richest-pile/solutions/2501655/yuan-di-dui-hua-o1-kong-jian-fu-ti-dan-p-fzdh/ 代码解答(强烈建议自行解答后再看) 参考题解 1234567891011class Solution: def pickGifts(self, gifts: List[int], k: int) ->...

2025-11-05
【Leetcode Daily】480滑动窗口中位数
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个数组和一个窗口大小 k,现在规定这个窗口从数组最左侧移到最右侧,求每个窗口的中位数。 思路分享 比起 【Leetcode Daily】295数据流的中位数,本题多加了需要删除的功能,但是对于堆而言,想要找到其中的值再删除,相当于重建,复杂度比较高。 这里就可以引入“懒删除堆”,顾名思义,这个堆删除值不会立刻删除,而是先记录下来,在做入堆,取堆顶等操作的同时,检查堆顶是否为需要删除的值,是则直接弹出堆顶,不是则照常操作。 https://leetcode.cn/problems/sliding-window-median/solutions/3628827/295-ti-lan-shan-chu-dui-pythonjavacgojsr-66ch/ 注意,对于大小堆这种写法引入删除后,注意保持 left 的 size 与 right 相等或者多...

2025-04-24
【Leetcode Daily】1052爱生气的书店老板
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给两个整型数组,以及一个整数 minutes,按某个要求(具体看原题,难以简化),求一个数组在另一个数组和 minutes 约束下的求的最大值。 思路分享 陆爻齐的思路是计算窗口内(也就是冷静的分钟)不满意生气离开的最大值,加上不生气的心情值,再减去所有生气离开的数值得出答案,但由于思想复杂了点,所以略微修改模板结构,也就是下面陆爻齐的答案。 参照灵茶山艾府,其实只要区分开两部分相加即可,然后直接参照模板。这两部分,一个是不生气的值,一个是生气下的值,取生气下最大值即可。这样就不用像上面一样多一次运算。 https://leetcode.cn/problems/grumpy-bookstore-owner/solutions/2751888/ding-chang-hua-dong-chuang-kou-fu-ti-dan-rch7/ 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 12345678910111213141516171819202122232425class Solution...

2025-04-28
【Leetcode Daily】1297子串的最大出现次数
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个字符串,求满足要求的子串中,出现最多的次数。该要求为 1. 内部的字母数量小于 maxLetters;2. 整个字符串的长度在 minSize 和 maxSize 之间(闭区间)。 思路分享 该题的难度在于干扰项 maxSize,由于求子串尽可能多的出现,所以该子串的长度必然越小越好,就是 minSize。 就是定长滑动窗口(【Leetcode Daily】1456定长子串中元音的最大数目),有了个字母数量不大于 maxLetters 的限制,再用哈希统计满足要求字符串出现的次数即可。 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 1234567891011121314151617181920212223242526272829class Solution {public: int maxFreq(string s, int maxLetters, int minSize, int maxSize) { vector<int>...

2025-04-23
【Leetcode Daily】1423可获得的最大点数
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整型数组和一个数字 k,求按照某种方式下获取卡牌所得的最大点数。该方式为每次只能够取得最左或者最右的卡牌。 思路分享 逆向思路,由于每次拿卡牌只拿两侧,所以中间部分是连续的,可以视为一个定长滑动窗口,只不过是求窗口内的最小和,通过这个数值得到答案。滑动窗口模板沿用【Leetcode Daily】1456定长子串中元音的最大数目 正向思路,穷举所有组合可能。 https://leetcode.cn/problems/maximum-points-you-can-obtain-from-cards/solutions/2551432/liang-chong-fang-fa-ni-xiang-si-wei-zhen-e3gb/ 代码解答(强烈建议自行解答后再看) 逆向 12345678910111213141516171819202122232425class Solution {public: int maxScore(vector<int>& cardPoints,...

2025-04-18
【Leetcode Daily】1343大小为K且平均值大于等于与之的子数组数目
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整数数组,两个整数 threshold 和 k。k是限定子数组的长度,threshold 是阈值。求这个数组中长度为 k 且平均值大于阈值 threshold 的数目。 注意,在算法题中,子数组默认连续,而子序列默认不连续。 思路分享 定长滑动窗口模板秒了,具体参照 【Leetcode Daily】1456定长子串中元音的最大数目 不过这里的和用 int 也没问题,我估计是因为是大于等于阈值这个条件的关系,大于的情况即使因为整数的小数丢失,也能算做等于情况计入。 代码解答(强烈建议自行解答后再看) 滑动窗口 1234567891011121314151617181920class Solution {public: int numOfSubarrays(vector<int>& arr, int k, int threshold) { int result = 0; int sum = 0; for (int i =...
公告
不定时更新,记录所学所想
系列文章
