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

千问 LeetCode 2569. 更新数组后处理求和查询 Java实现

这道题的核心是高效维护nums1的区间反转操作,因为数据规模达到10^5,暴力反转会超时。需要用到线段树(区间更新+区间查询)或BitSet来优化。

下面给出Java实现,采用线段树 + 懒标记的方案:

class Solution {
public long[] handleQuery(int[] nums1, int[] nums2, int[][] queries) {
int n = nums1.length;
// 计算nums2的初始和
long sum2 = 0;
for (int num : nums2) {
sum2 += num;
}

// 构建线段树
SegmentTree seg = new SegmentTree(nums1);

// 收集类型3的答案
List<Long> ans = new ArrayList<>();

for (int[] q : queries) {
if (q[0] == 1) {
// 操作1:反转nums1的[l, r]区间
seg.reverse(q[1], q[2]);
} else if (q[0] == 2) {
// 操作2:nums2[i] += nums1[i] * p
// 相当于 sum2 += nums1中1的个数 * p
sum2 += (long) seg.querySum() * q[1];
} else {
// 操作3:记录当前nums2的和
ans.add(sum2);
}
}

// 转换为long[]返回
return ans.stream().mapToLong(Long::longValue).toArray();
}

// 线段树节点
class SegNode {
int l, r;
int sum; // 区间内1的个数
boolean lazy; // 懒标记:是否需要反转
}

// 线段树
class SegmentTree {
private SegNode[] tr;
private int n;

public SegmentTree(int[] nums) {
this.n = nums.length;
tr = new SegNode[n * 4];
for (int i = 0; i < n * 4; i++) {
tr[i] = new SegNode();
}
build(1, 0, n - 1, nums);
}

// 建树
private void build(int u, int l, int r, int[] nums) {
tr[u].l = l;
tr[u].r = r;
if (l == r) {
tr[u].sum = nums[l];
return;
}
int mid = l + (r - l) / 2;
build(u * 2, l, mid, nums);
build(u * 2 + 1, mid + 1, r, nums);
pushup(u);
}

// 更新父节点信息
private void pushup(int u) {
tr[u].sum = tr[u * 2].sum + tr[u * 2 + 1].sum;
}

// 下传懒标记
private void pushdown(int u) {
if (tr[u].lazy) {
reverseNode(u * 2);
reverseNode(u * 2 + 1);
tr[u].lazy = false;
}
}

// 反转一个节点
private void reverseNode(int u) {
tr[u].sum = (tr[u].r - tr[u].l + 1) - tr[u].sum;
tr[u].lazy = !tr[u].lazy;
}

// 区间反转
public void reverse(int l, int r) {
reverse(1, l, r);
}

private void reverse(int u, int l, int r) {
if (tr[u].l >= l && tr[u].r <= r) {
reverseNode(u);
return;
}
pushdown(u);
int mid = tr[u].l + (tr[u].r - tr[u].l) / 2;
if (l <= mid) reverse(u * 2, l, r);
if (r > mid) reverse(u * 2 + 1, l, r);
pushup(u);
}

// 查询整个区间的和(1的个数)
public int querySum() {
return tr[1].sum;
}
}
}

核心思路

1. 问题分析:
- 操作1:反转nums1的区间[l, r](0变1,1变0)
- 操作2:nums2[i] += nums1[i] * p,相当于sum2 += nums1中1的个数 * p
- 操作3:返回当前nums2的和

2. 为什么用线段树:
- 操作1是区间修改(反转),操作2需要查询整个nums1中1的个数
- 线段树可以在O(log n)时间内完成区间反转和区间求和
- 懒标记(lazy tag)避免每次反转都更新到叶子节点

3. 关键细节:
- 反转一个节点时:sum = 区间长度 - 原sum(因为0变1,1变0)
- 懒标记用布尔值,反转两次等于没反转(!lazy)
- 操作2中,nums1中1的个数就是线段树根节点的sum值

复杂度分析

- 时间复杂度:O((n + q) log n),其中n是数组长度,q是操作次数
- 空间复杂度:O(n),线段树需要4倍空间

测试用例

public static void main(String[] args) {
Solution sol = new Solution();

// 示例1
int[] nums1 = {1, 0, 1};
int[] nums2 = {0, 0, 0};
int[][] queries = {{1, 1, 1}, {2, 1, 0}, {3, 0, 0}};
System.out.println(Arrays.toString(sol.handleQuery(nums1, nums2, queries))); // [3]

// 示例2
int[] nums1_2 = {1};
int[] nums2_2 = {5};
int[][] queries_2 = {{2, 0, 0}, {3, 0, 0}};
System.out.println(Arrays.toString(sol.handleQuery(nums1_2, nums2_2, queries_2))); // [5]
}

这个解法在LeetCode上可以高效通过所有测试用例,线段树是处理区间反转问题的标准解法。

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

相关文章:

  • ChatGPT API接入全流程详解:从密钥配置、请求封装到错误重试、流式响应的7步落地指南
  • 嵌入式测试学习第 17 天:常见接口:USB、Type-C、排针
  • 梨树县黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • 2025-2026年璀璨时代楼盘电话查询。购房前请核实项目资质与合同条款 - 品牌推荐
  • 腾讯云服务器跑通 Cube Sandbox:从 PVM 内核到 65 ms 冷启动的全程实战
  • 柳河县黄金回收店铺哪家好 靠谱门店推荐及联系方式 - 莘州文化
  • 千问 LeetCode 2569. 更新数组后处理求和查询 TypeScript实现
  • 2025-2026年欧博东方文化传媒电话查询:GEO优化服务使用前需核实资质与效果 - 品牌推荐
  • 实测才敢推!盘点2026年抢手爆款的的降AI率网站
  • 【独家实测】ChatGPT-4 Turbo vs GPT-3.5 Turbo单位token成本对比:附Python自动核算脚本(限免24h)
  • 奎文区黄金回收白银回收铂金回收店铺哪家好 靠谱门店推荐 - 莘州文化
  • 【西南地区首个ElevenLabs贵州话定制引擎】:基于217小时黔东南苗侗口音语料库的私有化部署手册
  • 从开发者视角感受Taotoken官方价折扣带来的实际成本节省
  • 历城区黄金回收白银回收铂金回收店铺哪家好 靠谱门店推荐 - 莘州文化
  • 2026升降平台车租赁选型指南:绵阳蜘蛛平台车、绵阳蜘蛛式高空车租赁、绵阳路灯维修高空车、绵阳路灯车租赁、绵阳路灯高空车租赁选择指南 - 优质品牌商家
  • 6款论文降AIGC工具亲测:AI痕迹彻底消失,这款便宜又好用
  • 从CI/CD到生产回滚:Gemini嵌入Java构建链的4层审查网(含Gradle/Maven插件零侵入部署脚本)
  • Sunshine终极指南:3分钟搭建跨平台游戏串流服务器,解锁你的私人游戏云
  • 云南全屋定制厂家性价比排行:核心实测维度拆解 - 奔跑123
  • CRM系统“没人爱用”的真相:Lovable架构的8个微交互锚点(附Figma组件库+埋点验证脚本)
  • 历下区黄金回收白银回收铂金回收店铺哪家好 靠谱门店推荐 - 莘州文化
  • 免费中医AI终极指南:仲景大模型如何让普通人也能享受专业中医咨询
  • 2026降AI率工具红黑榜:降AIGC平台怎么选?一文讲透
  • 洛谷 B4360:[GESP202506 四级] 画布裁剪 ← 二维字符数组
  • 给老系统装一层 “能办事的 AI”:企业 Agent 卡住的最后一步,SkillsUI 想补上
  • 2026年5月,四川空调清洗如何选?深度剖析宜宾兰嫂家政服务有限公司 - 2026年企业推荐榜
  • 【NotebookLM可信度红蓝对抗报告】:我们用17类对抗性提示攻击了12个主流配置,结果令人震惊…
  • 2026 谷歌 GEO 已成流量主战场,不懂 AI 搜索直接掉队
  • 2026定制PLC控制柜技术选型指南:食药设备电气成套控制柜/PLC变频控制柜/低压弱电集成柜/低压集成配电柜/选择指南 - 优质品牌商家
  • 利津县黄金回收白银回收铂金回收店铺哪家好 靠谱门店推荐 - 莘州文化