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      

相关内容

热门资讯

银价推涨光伏组件报价,下游企业... 来源:第一财经 受成本端银价上涨影响,本周光伏组件价格再次上调。据行业机构Infolink Cons...
黄金史诗级暴跌,原因可能与一纸... 当地时间1月30日,随着美联储前理事凯文·沃什(Kevin Warsh)正式被美国总统特朗普提名为下...
深圳国资七亿下场扫货白石洲? 来源:市场资讯 (来源:深圳房产在线) 最近看到,近日一则消息引发关注,就是今年1月发生一宗白石洲大...
国投智能2025业绩承压 AI... 来源:财联社 财联社1月30日讯(记者 方彦博)2025年,AI应用的商业化落地是众多AI企业面临的...
原创 男... 在爱情的海洋中,星座的波涛有时能揭示出隐藏的情感暗流。当男人在愤怒的风暴中显露出四种迹象时,或许他并...
农业银行董事长谷澍会见英格兰银... 来源:市场资讯 来源:中国农业银行 1月29日,农业银行董事长谷澍会见了英格兰银行副行长兼英国审慎监...
“易中天”,业绩大爆发!需求增... “易中天”2025年度业绩持续爆发! 1月30日晚间,中际旭创发布2025年度业绩预告,预计2025...
双平台战略提速:仙乐健康谋“A... 中国营养健康食品行业的龙头企业仙乐健康,在1月30日向市场投下了一枚重磅消息:公司已正式向香港联交所...
左季庆染指淳厚基金股权纷争为谁... 2026年1月6日,证监会一纸批复核准上海长宁国有资产经营投资有限公司(下称“长宁国资”)成为淳厚基...
上市即巅峰?拉芳家化首度亏损,... 为什么消费端对“拉芳”爱不起来了? 作者 | 方璐 编辑丨于婞 来源 | 野马财经 拉芳家化(603...
原创 黄... 1月31日晚间,英伟达CEO黄仁勋现身中国台湾台北市砖窑古早味怀旧餐厅,宴请了35位与英伟达合作的供...
山西太钢不锈钢股份有限公司 2... 来源:证券日报 证券代码:000825 证券简称:太钢不锈 公告编号:2026-001 本公司及董...
把自己的银行贷款出借给别人,有... 新京报讯(记者张静姝 通讯员邸越洋)因贷款出借后未被归还,原告牛女士将被告杨甲、杨乙诉至法院,要求二...
金价暴跌,刚买的金饰能退吗?有... 黄金价格大跌,多品牌设置退货手续费。 在过去两三天,现货黄金价格经历了“过山车”般的行情,受金价下跌...
预计赚超2500万!“豆腐大王... 图片来源:图虫创意 在经历了一年亏损后,“豆腐大王”祖名股份(003030.SZ)成功实现扭亏为盈。...
特朗普提名“自己人”沃什执掌美... 据新华社报道,当地时间1月30日,美国总统特朗普通过社交媒体宣布,提名美国联邦储备委员会前理事凯文·...
爱芯元智将上市:连年大额亏损,... 撰稿|多客 来源|贝多商业&贝多财经 1月30日,爱芯元智半导体股份有限公司(下称“爱芯元智”,HK...
一夜之间,10只A股拉响警报:... 【导读】深康佳A等10家公司昨夜拉响退市警报 中国基金报记者 夏天 1月30日晚间,A股市场迎来一波...
谁在操控淳厚基金?左季庆为谁趟... 2026年1月6日,证监会一纸批复核准上海长宁国有资产经营投资有限公司(下称“长宁国资”)成为淳厚基...
工商银行党委副书记、行长刘珺会... 人民财讯1月31日电,1月29日,工商银行党委副书记、行长刘珺会见来访的上海电气集团党委书记、董事长...