Leetcode.2488 统计中位数为 K 的子数组
创始人
2025-05-28 23:25:31
0

题目链接

Leetcode.2488 统计中位数为 K 的子数组 Rating :1999

题目描述

给你一个长度为 n 的数组 nums,该数组由从 1n不同 整数组成。另给你一个正整数 k

统计并返回 nums中的 中位数 等于 k非空子数组的数目

注意:

  • 数组的中位数是按 递增 顺序排列后位于 中间 的那个元素,如果数组长度为偶数,则中位数是位于中间靠 的那个元素。
    例如,[2,3,1,4]的中位数是 2[8,4,3,5,1]的中位数是 4
  • 子数组是数组中的一个连续部分。

示例 1:

输入:nums = [3,2,1,4,5], k = 4
输出:3
解释:中位数等于 4 的子数组有:[4]、[4,5] 和 [1,4,5] 。

示例 2:

输入:nums = [2,3,1], k = 3
输出:1
解释:[3] 是唯一一个中位数等于 3 的子数组。

提示:

  • n==nums.lengthn == nums.lengthn==nums.length
  • 1<=n<=1051 <= n <= 10^51<=n<=105
  • 1<=nums[i],k<=n1 <= nums[i], k <= n1<=nums[i],k<=n
  • ```nums````中的整数互不相同

解法:前缀和 + 哈希表

等价转换:

  • nums[i] > k,把 nums[i]看作 1
  • nums[i] < k,把 nums[i]看作 -1
  • nums[i] == k,把 nums[i]看作 0

就将求 中位数为k的子数组 转换为求 包括nums[i]==0这一项的且子数组和为 1或者 0的子数组。

所以我们最终的目的就是 求子数组和为 0或者 1的子数组个数(其中必须包含 nums[i]==0这一项)。

我们用 idx(nums[idx] == k)把原数组分为两段 [0 , idx - 1][idx + 1 , n - 1]

我们用一个哈希表 cnt记录子数组和 sum的出现次数,cnt[0] = 1代表 nums[idx]本身也是一个答案。

  1. 对于 [0 , idx - 1],我们从 idx - 1遍历到 0(因为要求的子数组必须包含 nums[idx]),更新子数组和 sum的出现次数。由于只考虑了左边的一段,所以合法的答案有 sum == 0sum == 1的子数组个数,即 cnt[0] + cnt[1]。我们先用 ans = cnt[0] + cnt[1]
  2. 对于 [idx + 1 , n - 1],我们从 idx + 1遍历到 n - 1(因为要求的子数组必须包含 nums[idx]),更新子数组和 sum的出现次数。这时我们需要考虑左右两边,左右的子数组的和分别为 leftSumrightSumleftSum + rightSum == 0 or 1。此时我们枚举的是 rightSum,所以只需要让 ans加上 cnt[1 - rightSum]cnt[-rightSum]h即可。

时间复杂度: O(n)O(n)O(n)

C++代码:


class Solution {
public:int countSubarrays(vector& nums, int k) {int n = nums.size();int idx = -1;for(int i = 0;i < n;i++){if(nums[i] == k){idx = i;break;}}unordered_map cnt;cnt[0] = 1;int sum = 0;for(int i = idx - 1;i >= 0;i--){if(nums[i] > k) sum++;else sum--;cnt[sum]++;}int ans = cnt[0] + cnt[1];sum = 0;for(int i = idx + 1;i < n;i++){if(nums[i] > k) sum++;else sum--;ans += cnt[-1*sum];ans += cnt[1 - sum];}         return ans;}
};

Python代码:

class Solution:def countSubarrays(self, nums: List[int], k: int) -> int:idx = nums.index(k);n = len(nums)cnt , sum = Counter({0:1}) , 0for i in range(idx - 1, -1, -1):sum = sum + 1 if nums[i] > k else sum - 1cnt[sum] += 1ans = cnt[0] + cnt[1]sum = 0for i in range(idx + 1,n):sum = sum + 1 if nums[i] > k else sum - 1ans += cnt[-1*sum]ans += cnt[1-sum]return ans      

相关内容

热门资讯

企业IP打造指南:小公司低成本... 小公司做企业IP,不是为了装门面,而是让客户在没见到你之前,就能通过内容知道你是谁、你解决什么问题、...
官方:赵心童入选世界斯诺克名人... 北京时间5月8日消息,世界斯诺克巡回赛(WST)今日正式公布了2025/26赛季年终奖项及名人堂更新...
小灰熊AI学员王锋:希望能跟上... 35了,老程序员了。 从进入互联网行业到现在,其实已经做了很多年移动端开发。最早那几年,安卓行业发展...
原创 2... 2026年全国两会把稳定房地产市场列为重点工作,政府工作报告明确提出因城施策控增量、去库存、优供给。...
一年翻倍,六年未归——徽商银行... 文:向善财经 今年的港股市场,与A股市场出现了明显的分化。 A股这边,科技板块在AI浪潮中热闹非凡;...
古井贡酒2025:在行业深度调... 以“稳”为底、以“新”为翼。 文/每日财报 杜康 在行业库存高企、价格倒挂的背景下,当多数酒企在为...
好上好8408万收购鼎瑞芯加码... 5月7日晚,好上好(001298.SZ)抛出一份收购公告,拟以8408万元现金收购深圳市鼎瑞芯科技有...
全面大撤离!李嘉诚英国“套现”... 突发,李嘉诚又卖了。 这次,套现了455亿。 金额不少,但更值得关注的是透露着不同寻常的信号。 因为...
油气价格上涨加剧法国一季度贸易... 据新华社,法国海关7日发布的数据显示,受中东局势推高国际油气价格影响,法国今年第一季度贸易逆差扩大至...
昆仑芯启动科创板IPO上市辅导... 5月8日,据证监会官网显示,昆仑芯(北京)科技股份有限公司于2026年5月7日正式启动科创板上市辅导...
贵州茅台酒股份有限公司关于回购... 来源:上海证券报 证券代码:600519 证券简称:贵州茅台 公告编号:临2026-016 贵州茅...
百度昆仑芯启动科创板上市辅导,... 5月8日,证监会官网显示,昆仑芯(北京)科技股份有限公司 (下称“昆仑芯”)于2026年5月7日正式...
滕州信华的承压时刻:罚单、失信... 2026年4月末,滕州信华美元债单日跌近2%,关联方被列“老赖”。半年前,这家AA+城投曾因非市场化...
002808,或被终止上市! 【导读】因触及财务类退市指标,*ST恒久或被终止上市 中国基金报记者 李智 又一A股或被终止上市。 ...
院士团队掌舵,溧阳这家企业已完... 近日,溧阳天目先导电池材料科技有限公司(下称“天目先导”)官宣完成B轮融资,投资方包括知卓创新资本、...
工商银行全新推出“工盈研选”品... 深圳商报·读创客户端记者 詹钰叶 近日,工商银行重磅推出「工盈研选」基金销售服务品牌,以客户盈利为核...
和讯信息胡云龙:逼空走势,周五... 今天市场出现逼空走势,场内投资者因持有筹码而尤为受益。五一前布局的投资者当前收获颇丰。然而,随着上证...
今晚,油价上调! 4月21日国内成品油价格下调以来,国际市场原油价格剧烈震荡,前期大幅上涨后近日有所回落,本次调价的前...
南方东英旗下两倍做多海力士,成... 【导读】南方东英旗下两倍做多海力士,成为全球最大的个股杠杆及反向产品 中国基金报记者 伊万 人工智能...
原创 金... 黄金,这东西从古至今就没离开过中国人的生活。从老辈人压箱底的小黄鱼,到如今年轻人结婚绕不开的“三金”...