当前位置: 首页 > 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的答案ListLong 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) {// 操作2nums2[i] nums1[i] * p// 相当于 sum2 nums1中1的个数 * psum2 (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变11变0- 操作2nums2[i] nums1[i] * p相当于sum2 nums1中1的个数 * p- 操作3返回当前nums2的和2. 为什么用线段树- 操作1是区间修改反转操作2需要查询整个nums1中1的个数- 线段树可以在O(log n)时间内完成区间反转和区间求和- 懒标记lazy tag避免每次反转都更新到叶子节点3. 关键细节- 反转一个节点时sum 区间长度 - 原sum因为0变11变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();// 示例1int[] 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]// 示例2int[] 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.zskr.cn/news/1350982.html

相关文章:

  • 千问 LeetCode 2561. 重排水果 Python3实现
  • 2026年国内不锈钢水箱厂家TOP5实力排行:成都实验室污水处理设备厂家、成都常温除氧器厂家、成都废水处理设备厂家选择指南 - 优质品牌商家
  • 2025-2026年欧易生物电话查询:使用多组学科研服务前需核实资质 - 品牌推荐
  • AI导演系统:编排角色扮演,让多智能体协作效率飙升10倍
  • 【性能评估】信标辅助双跳认知无线电无线中继选择方案的性能评估研究(Matlab代码实现)
  • Python(循环中断)
  • 2025-2026年全球蛋白组学服务公司推荐:五大口碑产品评测多组学整合降本增效市场份额价格 - 品牌推荐
  • 6款靠谱降AIGC软件 合规程度拉满
  • 2025-2026年耀华国际学校电话查询:预约探校前请确认学段匹配与资质 - 品牌推荐
  • 高通量细胞因子/生物因子检测技术介绍
  • 2026年5月北京别墅装修公司推荐:十大排名大宅设计防踩雷评测专业价格 - 品牌推荐
  • ElevenLabs未开放贵州话?别等了!用LoRA+Phoneme-aware Fine-tuning 72小时内复现本地化语音模型
  • 2025-2026年全球单细胞测序服务公司推荐:五大专业评测实验流程防污染注意事项市场份额 - 品牌推荐
  • 别再走弯路!2026亲测靠谱的AI论文写作工具|安心版
  • 架构评审的正确姿势:别让评审变成“挑刺大会”
  • ASP Folder:深入解析ASP文件夹的结构与功能
  • 有哪些一键生成论文工具是真的贴合学术规范,而不是模板套话?
  • 工业AI视觉十大通用缺陷检测手册|特征分析、光路方案、模型选型、后处理全落地
  • 2026年5月深圳除甲醛公司推荐:五大排行专业评测性价比高价格 - 品牌推荐
  • 3步解锁网易云音乐NCM文件:免费转换工具终极指南
  • ISTA 7D-2007 全解析|运输包装温度循环测试标准(CSDN 完整版)
  • 英雄联盟玩家必备:League Akari 智能助手完全指南
  • 掌握智能自动化:5个技巧优化炉石传说佣兵战记游戏体验
  • WireUI颜色选择器和日期选择器:提升用户体验的利器 [特殊字符][特殊字符]
  • 咋选北京装修公司?2026年5月推荐TOP10对比旧房翻新防超支评测适用场景特点 - 品牌推荐
  • Node.js 服务端应用无缝集成 Taotoken API 的实践
  • 创业公司如何利用 Taotoken 统一管理多个 AI 模型服务
  • 【Typescript】13-tsconfig与工程化实践
  • 【Typescript】12-模块声明文件与第三方库
  • Structured3D完整指南:如何用3D结构化数据轻松构建智能室内场景