2382. 删除操作后的最大子段和

给你两个下标从 0 开始的整数数组 nums 和 removeQueries ,两者长度都为 n 。对于第 i 个查询,nums 中位于下标 removeQueries[i] 处的元素被删除,将 nums 分割成更小的子段。

一个 子段 是 nums 中连续 整数形成的序列。子段和 是子段中所有元素的和。

请你返回一个长度为 n 的整数数组 answer ,其中 answer[i]是第 i 次删除操作以后的 最大 子段和。

**注意:**一个下标至多只会被删除一次。

示例 1:

输入:nums = [1,2,5,6,1], removeQueries = [0,3,2,4,1]
输出:[14,7,2,2,0]
解释:用 0 表示被删除的元素,答案如下所示:
查询 1 :删除第 0 个元素,nums 变成 [0,2,5,6,1] ,最大子段和为子段[2,5,6,1] 的和 14 。
查询 2 :删除第 3 个元素,nums 变成 [0,2,5,0,1] ,最大子段和为子段 [2,5]的和 7 。
查询 3 :删除第 2 个元素,nums 变成 [0,2,0,0,1] ,最大子段和为子段 [2] 的和 2 。
查询 4 :删除第 4 个元素,nums 变成 [0,2,0,0,0] ,最大子段和为子段 [2] 的和 2 。
查询 5 :删除第 1个元素,nums 变成 [0,0,0,0,0] ,最大子段和为 0 ,因为没有任何子段存在。 所以,我们返回 [14,7,2,2,0] 。

示例 2:

输入:nums = [3,2,11,1], removeQueries = [3,2,1,0]
输出:[16,5,3,0] 解释:用 0
表示被删除的元素,答案如下所示:
查询 1 :删除第 3 个元素,nums 变成 [3,2,11,0] ,最大子段和为子段 [3,2,11]的和 16 。
查询 2 :删除第 2 个元素,nums 变成 [3,2,0,0] ,最大子段和为子段 [3,2] 的和 5 。
查询 3:删除第 1 个元素,nums 变成 [3,0,0,0] ,最大子段和为子段 [3] 的和 3 。
查询 4 :删除第 0 个元素,nums变成 [0,0,0,0] ,最大子段和为 0 ,因为没有任何子段存在。 所以,我们返回 [16,5,3,0] 。

提示:

n == nums.length == removeQueries.length
1 <= n <= 1e5 1 <= nums[i] <=1e9
0 <= removeQueries[i] < n
removeQueries 中所有数字 互不相同 。

解析:

  • 利用反向思考,把删除转化为添加元素(从末尾到开头逐个添加)
  • 假如原来元素为 a b c ,现在需要添加c,就需要将b与a、c连接,a、c可能为一个元素集合,可以使用并查集处理集合合并。
  • 实际上,我们只需要将b,c(也就是元素x,x+1合并)合并即可(同时利用并查集将其所有元素值合并),不需要向左合并(如果将a、c同时与b合并,那么下次添加a的时候会二次合并b,造成重复)。
  • 又怎么能保证abc会作一个子段出现呢?
  • 如果a先删除,那么b先添加,bc合并,当添加a的时候也会向右合并把abc合并起来;
  • 如果a后删除,那么ab已经合并为一个元素,那么合并bc其实也就是合并ab 与c。因此,只需要向右合并即可。

代码:

lass Solution {public:int fa[100001];// 寻找父节点,状态压缩int find(int x){if(fa[x]!=x){fa[x]=find(fa[x]);return fa[x];}            else return x;}vector<long long> maximumSegmentSum(vector<int>& nums, vector<int>& removeQueries) {int n=nums.size();// 并查集数组初始化for(int i=0;i<n+1;i++)fa[i] = i;long long sum[n+1];memset(sum,0,sizeof(sum));vector<long long> ans(n,0);for(int i=n-1;i>0;i--){//cout<<i<<endl;int x=removeQueries[i];int to = find(x+1);fa[x] = to;// 添加节点更新集合所有元素和的值sum[to] += nums[x] + sum[x];// 新的子段,与原有子段最大值的最大值作为此状态下的结果ans[i-1] = max(ans[i],sum[to]);}return ans;}
};

做法来源:视频讲解

2382. 删除操作后的最大子段和--(phase2--day3)相关推荐

  1. LeetCode 2382. 删除操作后的最大子段和

    LeetCode 2382. 删除操作后的最大子段和 倒叙 + 并查集 typedef long long LL; class Solution {public:vector<long long ...

  2. leetcode:2382. 删除操作后的最大子段和【逆向思维 + 并查集困难题 + 细节不懂】

    分析 一个个删很难受 可以反过来一个个加 然后加的话回导致合并,所以用并查集 把当前的x和x + 1合并起来 更新每一段的和,把和聚集到find(x + 1)的这个代表元这里 ac code clas ...

  3. 数据结构学习笔记:顺序表的删除操作及其演化题目总结

    目录 前言 例题 类似题目1 类似题目2 类似题目3 类似题目4 类似题目5 结语 前言 文章代码皆在Dev-C++ 5.11中测试,主要是总结一些方法,从而总结一些规律使自己进一步地深化学习内容,仅 ...

  4. mysql查询数据不变_mysql之delete删除记录后数据库大小不变

    当DELETE后面跟条件的时候,则就会出现这个问题 delete from table_name where 条件 删除数据后,数据表占用的空间大小不会变. 不跟条件直接delete的时候. dele ...

  5. mysql 空位补0_MySQL 删除数据后物理空间未释放

    MySQL 删除数据后物理空间未释放 1. 进入数据库目录: cd  /var/lib/mysql/ 2. 备份要保存的数据库文件(切记!必须备份!部分数据库文件需要恢复!) mysqldump -h ...

  6. mysql之delete删除记录后数据库大小不变

    当DELETE后面跟条件的时候,则就会出现这个问题 delete from table_name where 条件 删除数据后,数据表占用的空间大小不会变. 不跟条件直接delete的时候. dele ...

  7. mysql .myd_关于mysql 删除数据后(.MYD,MYI)物理空间未释放

    关于mysql 删除数据后物理空间未释放 OPTIMIZE TABLE 当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小.这是因为删除操作后在数据文件中留下碎片所致.OPTIMIZE ...

  8. 解决sqlite 删除记录后数据库文件大小不变

    最的做的项目中要有到sqlite数据存储,写了测试程序进行测试,存入300万条记录,占用flash大小为 86.1M,当把表中的记录全部删除后发后数据库文件大小依然是 86.1M: 原因是: sqli ...

  9. 更新操作先删除缓存后更新DB,还是先更新DB后删除缓存问题???

    以前自己在学校学习redis的时候还真没想到这么多,上班后看公司的项目代码,发现都是先更新DB,然后删除缓存,而且更新DB后不会立马将DB数据放入缓存,然而我以前不管是查询还是update都是操作完D ...

最新文章

  1. 源代码查看工具 Source Navigator 使用心得
  2. python【蓝桥杯vip练习题库】ALGO-70最长字符串
  3. publishing failed with multiple errors
  4. 重庆邮电大学发布2021年最新小样本目标检测综述
  5. wxWidgets:wxDataViewTreeCtrl类用法
  6. 虚拟机系统与宿主机共享上网设置
  7. Linux命令-目录处理命令:mkdir
  8. 计算机网络之网络概述:3、性能指标(速率、带宽、吞吐量、时延、RTT、利用率)
  9. java中的pane,Java中scroll pane的使用(一)– 动态改变其client的大小 | 学步园
  10. 深入浅出设计模式(C#/Java版)
  11. Visual Studio爆炸! -VS2010 SP1 * BETA *已发布,上下文
  12. 《Advanced .NET Debugging》 读书笔记 Listing 3-6: 使用sxe在程序载入mscorwks之后停下来载入sos...
  13. echarts的用法
  14. python特殊回文数
  15. TJA1042T/3与国产CAN芯片SIT1042T/3性能对比
  16. centons7安装k8s集群
  17. OpenStack------Placement组件部署
  18. 【一点唐城】15个未来高科技产品会让你无法想象、这些开脑洞的设计太牛了
  19. Debug Hacks中文版——深入调试的技术和工具
  20. android方向触摸事件,Android触摸事件如何传递?

热门文章

  1. SAP 成本中心分配和分摊
  2. SDOI2019Round1游记
  3. VMware, RedHat, VirtualBOX, Ubuntu以及Fedora的安装和配置
  4. Tensorflow object detection API 搭建属于自己的物体识别模型(转载修改)
  5. 【CCNA证书需要什么资格?】
  6. 照片聚类2014年最新方法——“Clustering by Composition”
  7. Vue3和Vue2对比,我们如何选用?
  8. 颜色识别OpenCV
  9. 怎样写一个通用的JavaScript效果库!
  10. office 2010 密钥