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

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

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;
    }
};

做法来源:视频讲解

相关文章:

  • 时间复杂度计算题
  • 不愧是阿里内部“千亿级并发系统架构设计笔记”面面俱到,太全了
  • SpringCloud之配置中心
  • C++征途 --- Stack(栈)容器和Queue(队列)容器
  • Mysql 用户权限设置 细分数据库、表操作
  • 车路协同、车联网、智慧交通、智能网联车、自动驾驶、无人驾驶、高精度地图
  • AtCoder Beginner Contest 266 A-G
  • 2022年全球MEMS传感器市场总体规模及应用细分研究报告
  • 设计模式之命令模式
  • 算法竞赛进阶指南 观光之旅
  • 可编程 USB 转串口适配器开发板 参数设置与修改
  • pringboot毕业生就业信息管理毕业设计-附源码151501
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • 【JavaScript-内置对象】找对象,那家好,内置对象错不了,方便简单,还好用
  • 【面试专线】【基础知识】【JAVA】基础(三)(简答版)
  • [deviceone开发]-do_Webview的基本示例
  • 「面试题」如何实现一个圣杯布局?
  • Java 网络编程(2):UDP 的使用
  • Java方法详解
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • nginx 配置多 域名 + 多 https
  • oldjun 检测网站的经验
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • SpingCloudBus整合RabbitMQ
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • Vue--数据传输
  • 从setTimeout-setInterval看JS线程
  • 分布式事物理论与实践
  • 搞机器学习要哪些技能
  • 关于Flux,Vuex,Redux的思考
  • 关于Java中分层中遇到的一些问题
  • 简单易用的leetcode开发测试工具(npm)
  • 开源地图数据可视化库——mapnik
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 一起参Ember.js讨论、问答社区。
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​TypeScript都不会用,也敢说会前端?
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (10)STL算法之搜索(二) 二分查找
  • (c语言)strcpy函数用法
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (笔试题)分解质因式
  • (二)hibernate配置管理
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .bashrc在哪里,alias妙用
  • .jks文件(JAVA KeyStore)
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net Signalr 使用笔记
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法