当前位置: 首页 > news >正文

DeepSeek LeetCode 3739. 统计主要元素子数组数目 II Java实现

问题理解

题目:给定整数数组 nums 和目标值 target,返回 nums 中满足 target 是主要元素的非空子数组数量。

主要元素定义:在子数组中出现次数严格大于其长度的一半。

---

核心思路:转换为前缀和问题

将 nums 转换为一个新数组 a:

· 若 nums[i] == target,则 a[i] = 1
· 否则 a[i] = -1

此时,一个子数组中 target 是主要元素 ⇔ 该子数组在 a 中的元素和 严格大于 0。

设前缀和数组 pre,pre[i] 表示 a[0..i-1] 的和(pre[0]=0)。子数组 (l, r] 的和为 pre[r] - pre[l],要求 pre[r] - pre[l] > 0,即 pre[l] < pre[r]。

问题转化为:对每个位置 r,统计前面有多少个 l 满足 pre[l] < pre[r],累加即为答案。

---

Java 实现(O(n log n),有序列表)

```java
import java.util.*;

class Solution {
public long countMajoritySubarrays(int[] nums, int target) {
// 有序列表,维护所有已出现的前缀和
List<Integer> sortedPrefixes = new ArrayList<>();
sortedPrefixes.add(0); // pre[0] = 0

long ans = 0;
int pre = 0; // 当前前缀和

for (int num : nums) {
pre += (num == target ? 1 : -1);
// 在有序列表中查找第一个 >= pre 的位置
// 该位置之前的所有前缀和都 < pre
int idx = Collections.binarySearch(sortedPrefixes, pre);
if (idx < 0) {
idx = -idx - 1;
}
ans += idx;
// 将当前前缀和插入到有序列表中
sortedPrefixes.add(idx, pre);
}

return ans;
}
}
```

复杂度:时间 O(n log n),空间 O(n)。

---

更优实现(O(n),计数数组)AC

由于前缀和取值范围为 [-n, n],可用计数数组实现 O(1) 查询:

```java
class Solution {
public long countMajoritySubarrays(int[] nums, int target) {
int n = nums.length;
int offset = n + 1; // 将范围 [-n, n] 映射到 [1, 2n+1]
long[] cnt = new long[2 * n + 3];
long[] acc = new long[2 * n + 3];

int pre = offset; // 初始前缀和为0,映射到 offset
cnt[pre] = 1;
acc[pre] = 1;

long ans = 0;
for (int num : nums) {
pre += (num == target ? 1 : -1);
// cnt[pre] 是当前前缀和出现的次数(包括当前这次)
// acc[pre-1] 是所有小于当前前缀和的前缀和出现次数之和
acc[pre] = acc[pre - 1] + ++cnt[pre];
ans += acc[pre - 1];
}
return ans;
}
}
```

复杂度:时间 O(n),空间 O(n)。

---

示例验证

以 nums = [1,2,2,3], target = 2 为例:

· 转换后:[-1, 1, 1, -1]
· 前缀和:0, -1, 0, 1, 0
· 统计 pre[l] < pre[r] 的对数:
· r=1: pre= -1,前面 < -1 的没有 → 0
· r=2: pre=0,前面 < 0 的有 -1 → 1
· r=3: pre=1,前面 < 1 的有 -1, 0, 0 → 3
· r=4: pre=0,前面 < 0 的有 -1 → 1
· 总计 = 0 + 1 + 3 + 1 = 5 ✅

http://www.jsqmd.com/news/1272763/

相关文章:

  • Unity URP卡通渲染实战:基于Custom Render Feature实现法线外描边与色阶切分
  • 免费视频转文字工具推荐:先排除三类不合适的再入选 - 软件小管家
  • DM6467硬件设计核心:仿真控制、电源时钟与上拉电阻实战解析
  • 江门精选口碑瓷砖空鼓维修公司推荐2026卫生间墙砖起翘修复 - 北京优选
  • 【WebFlux】第二篇 —— Project Reactor 核心数据类型与doOnXXX介绍
  • MySQL SQL执行全链路解析:从Parser到Executor的完整生命周期
  • python数据可视化技巧的100个练习 -- 48. 分类数据的分面网格图
  • 微信小程序健康管理工具开发实战:PHP+MySQL全开源方案
  • 华为MetaERP 以同样的大卡车生产BOM和价格数据,用 Oracle EBS(R12) 的三种成本方法重新走一遍全链路。Oracle EBS 的成本管理逻辑与 SAP 核心思想相通,但模块名称、事
  • JTAG接口原理与ARM Cortex-M4调试实战:从TAP状态机到CoreSight架构
  • Seraphine:基于LCU API的智能游戏数据交互平台
  • 鸿蒙多功能工具箱开发实战(三十二)-多设备适配与响应式布局
  • 企业AI平台用户活跃度提升策略与实践
  • 7.20-7.26学习笔记
  • 智能写作辅助系统:课程论文写作的AI解决方案
  • 情感计算与VR技术在教育中的创新应用
  • SRIO外设复位与电源管理:从全局复位到逻辑块控制的嵌入式实践
  • AO3镜像站完整指南:如何轻松访问全球最大同人创作平台
  • 体验家 XMPlus 跨系统数据同步与一致性保障机制:CEM 与 CRM/ERP/BI 的双向集成架构
  • 大疆感知融合面试,ICP算法手推这关太硬核了
  • MySQL 分页有什么性能问题?怎么优化?
  • Claude Sonnet 4.5:AI全能智能体的性能与应用解析
  • Golang学习-冒泡排序(Bubble Sort)
  • C++竞赛必考:深度解析“必然事件”逻辑题陷阱与通解
  • Linux网络排查利器:ss命令核心用法与实战场景详解
  • (二十六)BLSG方案
  • AMD Instinct MI455X AI加速器:突破大模型训练内存墙与能效瓶颈
  • C# + 卷积神经网络:工业图像分类任务的底层原理与工程落地
  • 2026实测教程:微信保存的表情包怎么发到抖音?亲测免费方法 - 图片处理研究员
  • 深入解析DSP控制寄存器文件:中断、异常与系统状态管理