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

【LeetCode 算法】Handling Sum Queries After Update 更新数组后处理求和查询-Segment Tree

文章目录

  • Handling Sum Queries After Update 更新数组后处理求和查询

Handling Sum Queries After Update 更新数组后处理求和查询

问题描述:

给你两个下标从 0 开始的数组 n u m s 1 和 n u m s 2 nums1 和 nums2 nums1nums2 ,和一个二维数组 q u e r i e s queries queries 表示一些操作。总共有 3 种类型的操作:

操作类型 1 为 q u e r i e s [ i ] = [ 1 , l , r ] queries[i] = [1, l, r] queries[i]=[1,l,r] 。你需要将 n u m s 1 nums1 nums1 从下标 l 到下标 r 的所有 0 反转成 1 或将 1 反转成 0 。l 和 r 下标都从 0 开始。
操作类型 2 为 q u e r i e s [ i ] = [ 2 , p , 0 ] queries[i] = [2, p, 0] queries[i]=[2,p,0] 。对于 0 < = i < n 0 <= i < n 0<=i<n 中的所有下标,令 n u m s 2 [ i ] = n u m s 2 [ i ] + n u m s 1 [ i ] ∗ p nums2[i] = nums2[i] + nums1[i] * p nums2[i]=nums2[i]+nums1[i]p
操作类型 3 为 q u e r i e s [ i ] = [ 3 , 0 , 0 ] queries[i] = [3, 0, 0] queries[i]=[3,0,0] 。求 nums2 中所有元素的和。
请你返回一个数组,包含所有第三种操作类型的答案。

1 < = n u m s 1. l e n g t h , n u m s 2. l e n g t h < = 1 0 5 n u m s 1. l e n g t h = n u m s 2. l e n g t h 1 < = q u e r i e s . l e n g t h < = 1 0 5 q u e r i e s [ i ] . l e n g t h = 3 0 < = l < = r < = n u m s 1. l e n g t h − 1 0 < = p < = 1 0 6 0 < = n u m s 1 [ i ] < = 1 0 < = n u m s 2 [ i ] < = 1 0 9 1 <= nums1.length,nums2.length <= 10^5\\ nums1.length = nums2.length\\ 1 <= queries.length <= 10^5\\ queries[i].length = 3\\ 0 <= l <= r <= nums1.length - 1\\ 0 <= p <= 10^6\\ 0 <= nums1[i] <= 1\\ 0 <= nums2[i] <= 10^9 1<=nums1.length,nums2.length<=105nums1.length=nums2.length1<=queries.length<=105queries[i].length=30<=l<=r<=nums1.length10<=p<=1060<=nums1[i]<=10<=nums2[i]<=109

分析

这个问题给的2个数组nums1,nums2,同时还有query指令。

问题本身比较绕, n u m s 1 nums1 nums101数组,而 n u m s 2 nums2 nums2可以看成是由 n u m s 1 nums1 nums1的一个函数映射
而每次的 q u e r y query query指令为3的时候,需要计算出 n u m s 2 nums2 nums2元素和

如果是纯粹计算数组的元素和,是配不上这个hard。
没错,问题的query指令还有1和2,它们会对nums1进行修改,从而影响到nums2的元素,进而会影响到结果。

最原始的方式就是暴力

  • q u e r y = = 1 query==1 query==1的时候,会将 n u m s 1 nums1 nums1中的区间 [ l , r ] [l,r] [l,r] 01 01 01进行反转,即0变1,1变0,而产生的影响就是 [ l , r ] [l,r] [l,r]内的出现的1,会导致处于该区间内的 n u m s 2 [ i ] nums2[i] nums2[i],增加 n u m s 1 [ i ] ∗ p nums1[i]*p nums1[i]p.

  • q u e r y = = 1 query==1 query==1的时候,对 n u m s 1 nums1 nums1修改的时间复杂度 O ( k ) O(k) O(k),k为区间的范围

  • q u e r y = = 2 query==2 query==2,对 n u m s 2 nums2 nums2的修改时间复杂度 O ( N ) O(N) O(N)

  • q u e r y = = 3 query==3 query==3,要计算 s u m ( n u m s 2 ) sum(nums2) sum(nums2),时间复杂度 O ( N ) O(N) O(N).

那么整体的时间复杂度就是 O ( N 2 ) O(N^2) O(N2),到此暴力的模拟思路就可以完成了,结果TLE

其实nums2这个数组,是一个中间数组,虽然是统计nums2的和,实际上并不需要得到nums2 的详细元素。

在该问题中nums2的和在指令执行的过程中一定是单调递增的,而且在 q u e r y = 1 query=1 query=1之后,区间 [ l , r ] [l,r] [l,r]产生了 x 个 1 x个1 x1,那么这 x 个 1 x个1 x1会影响到对应 n u m s 2 nums2 nums2对应这个区间的 n u m s 2 [ i ] nums2[i] nums2[i],效果就是这个区间的nums2的和增加了x*p

如果一开始nums1有x个1,那么nums2初始和为 s u m 1 sum_1 sum1,当进行了 q u e r y = = 1 query==1 query==1 的操作,nums1的某个区间出现了 x 1 x_1 x1个1,此时nums2的元素和就是 s u m 1 + x 1 ∗ p sum_1+x_1*p sum1+x1p.

所以如果可以快速的统计 n u m s 1 nums1 nums1在每个 q u e r y = = 1 query==1 query==1的操作下,区间产生的1的数量,就可以快速的累加到nums2的元素和上,这样就可以在 O ( 1 ) O(1) O(1)时间复杂度下得到 q u e r y = = 3 query==3 query==3时的结果。

而能够达到这个效果的,就是线段树。而且线段树在解决这类问题中,更新和查询的时间复杂度都是 O ( l o g N ) O(logN) O(logN),所以整体的时间复杂度就是 O ( N l o g N ) O(NlogN) O(NlogN)

代码

线段树

public long[] handleQuery(int[] nums1, int[] nums2, int[][] queries) {int n = nums1.length, m = 0, i = 0;cnt1 = new int[n * 4];flip = new boolean[n * 4];build(nums1, 1, 1, n);long sum = 0L;for (var x : nums2){sum += x;}for (var q : queries){if (q[0] == 3) ++m;}long[] ans = new long[m];for (var q : queries) {if (q[0] == 1){update(1, 1, n, q[1] + 1, q[2] + 1);  } else if (q[0] == 2){sum += (long) q[1] * cnt1[1];  } else{ans[i++] = sum;} }return ans;}// segment treeprivate int[] cnt1;private boolean[] flip;// 维护区间 1 的个数private void maintain(int o) {cnt1[o] = cnt1[o * 2] + cnt1[o * 2 + 1];}// 执行区间反转private void do_(int o, int l, int r) {cnt1[o] = r - l + 1 - cnt1[o];flip[o] = !flip[o];}// 初始化线段树   o,l,r=1,1,nprivate void build(int[] a, int o, int l, int r) {if (l == r) {cnt1[o] = a[l - 1];return;}int m = (l + r) / 2;build(a, o * 2, l, m);build(a, o * 2 + 1, m + 1, r);maintain(o);}// 反转区间 [L,R]   o,l,r=1,1,nprivate void update(int o, int l, int r, int L, int R) {if (L <= l && r <= R) {do_(o, l, r);return;}int m = (l + r) / 2;if (flip[o]) {do_(o * 2, l, m);do_(o * 2 + 1, m + 1, r);flip[o] = false;}if (m >= L){update(o * 2, l, m, L, R);} if (m < R){update(o * 2 + 1, m + 1, r, L, R);  } maintain(o);}

时间复杂度 O ( N l o g N ) O(NlogN) O(NlogN)

空间复杂度 O ( N ) O(N) O(N)

代码来源于 灵神大佬,略有调整,线段树写的很简洁。

Tag

Array

Segment Tree

相关文章:

【LeetCode 算法】Handling Sum Queries After Update 更新数组后处理求和查询-Segment Tree

文章目录 Handling Sum Queries After Update 更新数组后处理求和查询问题描述&#xff1a;分析代码线段树 Tag Handling Sum Queries After Update 更新数组后处理求和查询 问题描述&#xff1a; 给你两个下标从 0 开始的数组 n u m s 1 和 n u m s 2 nums1 和 nums2 nums1…...

基于Linux操作系统中的MySQL数据库SQL语句(三十一)

MySQL数据库SQL语句 目录 一、SQL语句类型 1、DDL 2、DML 3、DCL 4、DQL 二、数据库操作 1、查看 2、创建 2.1、默认字符集 2.2、指定字符集 3、进入 4、删除 5、更改 6、练习 三、数据表操作 &#xff08;一&#xff09;数据类型 1、数值类型 1.1、TINYINT …...

【Matlab】基于BP神经网络的数据回归预测新数据(Excel可直接替换数据)

【Matlab】基于BP神经网络的数据回归预测新数据(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码5.1 main.m5.2 NewData.m6.完整代码6.1 main.m6.2 NewData.m7.运行结果1.模型原理 基于BP神经网络的数据回归预测是一种常见的机器学习方法,用于处…...

HTTPS连接过程中的中间人攻击

HTTPS连接过程中的中间人攻击 HTTPS连接过程中间人劫持攻击 HTTPS连接过程 https协议就是httpssl/tls协议&#xff0c;如下图所示为其连接过程&#xff1a; HTTPS连接的整个工程如下&#xff1a; https请求&#xff1a;客户端向服务端发送https请求&#xff1b;生成公钥和私…...

redis启动失败,oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo

在redis文件夹下&#xff0c;启动redis正常。 但是加入到system后启动redis失败。 一直处于starting状态。 对比正常redis服务的配置之后&#xff0c;把redis.conf里的守护进程关掉就可以了&#xff08;但是没用system管理之前&#xff0c;直接./redis.server启动是可以的&…...

milvus: 专为向量查询与检索设计的向量数据库

1. 什么是milvus&#xff1f; milvus docs milvus release Milvus的目标是&#xff1a;store, index, and manage massive embedding vectors generated by deep neural networks and other machine learning (ML) models. Milvus 向量数据库专为向量查询与检索设计&#xf…...

【C# 数据结构】Heap 堆

【C# 数据结构】Heap 堆 先看看C#中有那些常用的结构堆的介绍完全二叉树最大堆 Heap对类进行排序实现 IComparable<T> 接口 对CompareTo的一点解释 参考资料 先看看C#中有那些常用的结构 作为 数据结构系类文章 的开篇文章&#xff0c;我们先了解一下C# 有哪些常用的数据…...

智慧园区楼宇合集:数字孪生管控系统

智慧园区是指将物联网、大数据、人工智能等技术应用于传统建筑和基础设施&#xff0c;以实现对园区的全面监控、管理和服务的一种建筑形态。通过将园区内设备、设施和系统联网&#xff0c;实现数据的传输、共享和响应&#xff0c;提高园区的管理效率和运营效益&#xff0c;为居…...

Ajax 黑马学习

Ajax 资源 数据是服务器对外提供的资源,通过 请求 - 处理 - 响应方式获取 请求服务器数据, 用到 XMLHttpRequest 对象 XMLHttpRequest 是浏览器提供的js成员, 通过它可以请求服务器上的数据资源 let xmlHttpRequest new XMLHttpRequest(); 请求方式 : get向服务器获取数据…...

软件应用开发的常见环境

一般来说&#xff0c;在小型项目中可能只有开发环境和生产环境&#xff1b;在中型项目中会有开发环境、staging environment、生产环境&#xff1b;在大型项目中会有开发环境、测试环境、staging environment、生产环境。 一、Dev Env / Development Environment 开发环境 开…...

Rust中的iter(), into_iter(), iter_mut()

在Rust中&#xff0c;iter(), into_iter(), iter_mut()都是用于在集合类型上创建迭代器的方法。这三个方法各有不同&#xff0c;下面一一进行介绍。 iter(): iter() 方法创建一个不可变的引用迭代器。当你只想读取集合中的元素&#xff0c;而不想改变它们或消耗集合时&#xff…...

[SQL挖掘机] - 日期函数 - current_date

current_date函数时&#xff0c;它通常被用来获取当前的日期。它返回一个表示当前日期的日期值。 current_date函数没有任何参数&#xff0c;因此只需简单地调用它即可获得系统当前日期。 以下是一个示例&#xff1a; select current_date;这将返回当前日期&#xff0c;例如…...

JAVA面试总结-Redis篇章(三)——缓存雪崩

JAVA面试总结-Redis篇章&#xff08;三&#xff09;——缓存雪崩...

maven编译报错

参考链接&#xff1a;mvn打包No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK_51CTO博客_mvn打包命令 在执行 yum install -y java-1.8.0-opensdk命令后&#xff0c;使用maven去编译打包&#xff0c;结果报错&#xff0c; …...

HPC集群调度系统和计算系统

什么是计算云&#xff1f; 所谓的计算云指的是为计算业务优化的类云基础架构&#xff0c;它强调用云的方式解决计算问题&#xff0c;而不是将“计算”搬到现有的公有云或者容器云上。 目前公有云或者容器云&#xff08;例如k8s&#xff09;上的HPC解决方案本质上都是将现有的H…...

pg_archivecleanup清理wal日志

一、 注意事项 pg_archivecleanup代码中仅进行了wal日志文件名的对比&#xff0c;没有实现对WAL日志名及对应生成时间的判断。在WAL日志未被重命名时&#xff0c;时间与日志名顺序名一致&#xff0c;没有问题。一旦WAL日志被重命名&#xff0c;pg_archivecleanup清理就可能清理…...

继承中的访问级别

值得思考的问题 子类是否可以直接访问父类的私有成员&#xff1f; 思考过程 继承中的访问级别 面向对象中的访问级别不止是 public 和 private 可以定义 protected 访问级别 关键字 protected 的意义 修饰的成员不能被外界直接访问修饰的成员可以被子类直接访问 思考 为什…...

(学习日记)2023.06.09

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…...

激光雷达-相机联合标定

https://f.daixianiu.cn/csdn/9499401684344864.html ros usb相机内参标定 ROS系统-摄像头标定camera calibration_berry丶的博客-CSDN博客...

[golang gin框架] 40.Gin商城项目-微服务实战之Captcha验证码微服务

本次内容需要 gin框架基础知识, golang微服务基础知识才能更好理解 一.Captcha验证码功能引入 在前面,讲解了微服务的架构等,这里,来讲解前面商城项目的 Captcha验证码 微服务 ,captcha验证码功能在前台,后端 都要用到 ,可以把它 抽离出来 ,做成微服务功能 编辑 这个验证码功能…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...