[leetcode]1749. 任意子数组和的绝对值的最大值(dp)

devtools/2025/3/31 22:47:57/

题目链接

题意

给定一个数组
求任意一个子数组和的绝对值的最大值(子数组可以为空)

方法一

对于最大子段和、最小子段和分别动态规划
最后对abs取max

思路

dpmx[i]表示以nums[i]结尾的子段中最大子段和
dpmn[i]表示以nums[i]结尾的子段中最小子段和

Code

#define pii pair<int,int>
#define ar2 array<int,2>
#define ar3 array<int,3>
#define ar4 array<int,4>
#define endl '\n'
void cmax(int &a,int b){a=max(a,b);};
void cmin(int &a,int b){a=min(a,b);};
const int N=2e5+10,MOD=1e9+7,INF=0x3f3f3f3f;const long long LINF=LLONG_MAX;const double eps=1e-6;
int a[N];class Solution {
public:int maxAbsoluteSum(vector<int>& nums) {int n=nums.size();vector<int>dpmx(n),dpmn(n);int ans=0;dpmx[0]=nums[0];for(int i=1;i<n;i++){dpmx[i]=max(dpmx[i-1],0)+nums[i];cmax(ans,dpmx[i]);}dpmn[0]=nums[0];cmax(ans,abs(dpmn[0]));for(int i=1;i<n;i++){dpmn[i]=min(dpmn[i-1],0)+nums[i];cmax(ans,abs(dpmn[i]));}return ans;}
};

实现细节

注意记得ans要跟dpmn的第一个元素取max

空间优化版

#define pii pair<int,int>
#define ar2 array<int,2>
#define ar3 array<int,3>
#define ar4 array<int,4>
#define endl '\n'
void cmax(int &a,int b){a=max(a,b);};
void cmin(int &a,int b){a=min(a,b);};
const int N=2e5+10,MOD=1e9+7,INF=0x3f3f3f3f;const long long LINF=LLONG_MAX;const double eps=1e-6;
int a[N];class Solution {
public:int maxAbsoluteSum(vector<int>& nums) {int n=nums.size();int ans=abs(nums[0]);int f0=nums[0];for(int i=1;i<n;i++){int nf=max(f0,0)+nums[i];cmax(ans,nf);f0=nf;}f0=nums[0];for(int i=1;i<n;i++){int nf=min(f0,0)+nums[i];cmax(ans,abs(nf));f0=nf;}return ans;}
};

方法二

前缀和 遍历尝试以[1,n-1]每个元素作为子数组结尾的情况 对n个sum取max

思路

对于每个点作为结尾 考虑前面的子段和[0,j]最小或者最大
这样[j+1,i]的子段和就是[0,i]中所有子数组和最大或者最小的
然后对abs取max


这里使用set维护前面的子段和 也可以开一个大根堆和一个小根堆

Code

class Solution {
public:int maxAbsoluteSum(vector<int>& nums) {int n=nums.size();set<int>st;int sum=0,ans=0;st.emplace(0);for(int i=0;i<n;i++){sum+=nums[i];ans=max({ans,abs(sum-*st.begin()),abs(sum-*st.rbegin())});st.emplace(sum);}return ans;}
};

http://www.ppmy.cn/devtools/172080.html

相关文章

基于SpringBoot + Vue 的餐厅点餐管理系统

SpringBootVue餐厅点餐管理系统 技术框架 后端&#xff1a;springboot mybatisPlus前端&#xff1a;Vue2 elementUI数据库&#xff1a;mysql项目构建工具&#xff1a;maven 数据库表 14张 角色及功能 管理员&#xff1a;登录、用户管理、餐桌信息管理、菜品类型管理、菜…

Linux Shell(Bash) 快捷键整理

导航与编辑 Ctrl A&#xff1a;光标移动到行首Ctrl E&#xff1a;光标移动到行尾Ctrl B&#xff1a;光标向左移动一个字符&#xff08;等同左箭头&#xff09;Ctrl F&#xff1a;光标向右移动一个字符&#xff08;等同右箭头&#xff09;Alt B&#xff1a;光标向左移动一…

TiDB 可观测性解读(二)丨算子执行信息性能诊断案例分享

导读 可观测性已经成为分布式系统成功运行的关键组成部分。如何借助多样、全面的数据&#xff0c;让架构师更简单、高效地定位问题、分析问题、解决问题&#xff0c;已经成为业内的一个技术焦点。本系列文章将深入解读 TiDB 的关键参数&#xff0c;帮助大家更好地观测系统的状…

深入理解视频编码:RGB与YUV格式、采样帧

图像格式 RGB格式 RGB 原理 RGB&#xff08;Red, Green, Blue&#xff09;是一种基于加色模型的颜色编码方式&#xff0c;它通过组合不同强度的红色、绿色和蓝色光来产生各种颜色。在数字图像中&#xff0c;RGB 通常使用三个数值&#xff08;每个颜色通道一个&#xff09;来表…

02[FlareOn4]login

题目来源&#xff1a;tps://buuoj.cn/challenges 1&#xff0c;打开/login.html 获得一个输入框 ctrlu查看源码 <!DOCTYPE Html /> <html><head><title>FLARE On 2017</title></head><body><input type"text" name&qu…

Go 语言标准库中flag模块详细功能介绍与示例

Go语言的 flag 模块用于解析命令行参数&#xff0c;支持定义和解析各种类型的参数&#xff08;如字符串、整数、布尔值等&#xff09;。以下是 flag 模块的核心方法及示例说明&#xff1a; 1. 定义命令行参数 flag.String、flag.Int、flag.Bool 等 定义不同数据类型的命令行参…

elementplus的el-tabs路由式

在使用 Element Plus 的 el-tabs 组件&#xff0c;实现路由式的切换&#xff08;即点击标签页来切换不同的路由页面&#xff09;。下面是一个基于 Vue 3 和 Element Plus 实现路由式 el-tabs 的基本步骤和示例。 步骤 1: 安装必要的库 在vue3项目安装 Vue Router 和 Element …

【Elasticsearch基础】CRUD操作实践

Elasticsearch作为最流行的搜索和分析引擎&#xff0c;其核心CRUD&#xff08;创建、读取、更新、删除&#xff09;操作是每个开发者必须掌握的技能。本文将详细介绍Elasticsearch的基础数据操作&#xff0c;并提供可直接复用的curl示例。 1 创建索引与文档 1.1 创建索引 // …