LeetCode 动态规划 任意子数组和的绝对值的最大值

server/2024/12/2 10:42:38/

任意子数组和的绝对值的最大值

给你一个整数数组 nums 。一个子数组 [numsl, numsl+1, …, numsr-1, numsr] 的 和的绝对值 为 abs(numsl + numsl+1 + … + numsr-1 + numsr) 。
请你找出 nums 中 和的绝对值 最大的任意子数组(可能为空),并返回该 最大值 。
abs(x) 定义如下:
如果 x 是负整数,那么 abs(x) = -x 。
如果 x 是非负整数,那么 abs(x) = x 。
示例 1:
输入:nums = [1,-3,2,3,-4]
输出:5
解释:子数组 [2,3] 和的绝对值最大,为 abs(2+3) = abs(5) = 5 。
示例 2:
输入:nums = [2,-5,1,-4,3,-2]
输出:8
解释:子数组 [-5,1,-4] 和的绝对值最大,为 abs(-5+1-4) = abs(-8) = 8 。
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104

题解

首先来一个错误的思路

错误思路

对于每一个数组的元素,它只有成为前面的子数组的一部分或者成为另一个新数组的开头这两种选择

只需要选这两种选择中执行后绝对值更大的就行了

错误原因

举个例子

数组[8,-2,-6,-1,-10]

显然最大和的绝对值子数组为-2,-6,-1,-10

但是依据上述思路,对于-2这个数据,加上前面的8之后的绝对值更大,我们就将8加上

但是加上8之后导致后面的计算就无法取到最大的子数组值

换句话说

最大的绝对值是最大的正或最小的负

上诉思路中,对于每一个元素我们都选择了最大的正或最小的负中的一个

这样就导致后面的数据进行选择的时候少了一种可能

所以不能按照当前数据与以前面数据结尾的子数组的绝对值的最大值进行比较从而得出结果的思路

因为对于绝对值是需要在最大的正与最小的负中选择的

以前面数据结尾的子数组的绝对值的最大值少了其中一种情况

求出的结果是不正确的

正确的思路应当是比较以前面数据结尾的子数组的最大值与最小值

判断是否加上最大或最小这两种情况之后选择其中绝对值最大的

正确思路

对于绝对值,我们可以求出子数组和的最大值以及最小值

再选择其中绝对值大的即可

对于求子数组的最大值

我们可以将问题拆分为

对于一个数据,它只有加入以前一个数据结尾的子数组或者不加入成为新的开头

如果以前一个数据结尾的子数组的和是负的,显然应当不加入成为新的开头

否则加入以前一个数据结尾的子数组

每一个数据选择后的最大值就是子数组的最大值

求最小值同理

最后选择其中绝对值大的

代码如下

int maxAbsoluteSum(int* nums, int numsSize) {int res=abs(nums[0]);int max=nums[0];int min=nums[0];for(int i=1;i<numsSize;i++){if(max>0){max+=nums[i];}else{max=nums[i];}if(min<0){min+=nums[i];}else{min=nums[i];}int n=max>-min?max:-min;if(n>res){res=n;}}return res;
}

http://www.ppmy.cn/server/146689.html

相关文章

【Maven系列】深入解析 Maven 常用命令

前言 在当今的软件开发过程中&#xff0c;项目管理是至关重要的一环。项目管理包括了项目构建、依赖管理以及发布部署等诸多方面。而在Java生态系统中&#xff0c;Maven已经成为了最受欢迎的项目管理工具之一。Maven 是一套用于构建、依赖管理和项目管理的工具&#xff0c;主要…

Django Admin与Vue前后端分离开发实战教程

前言 本教程将详细介绍如何将Django Admin与Vue.js结合,实现一个既有完整后台管理功能,又能支持自定义前端页面的现代化系统。 一、环境准备 1. 创建虚拟环境 # 创建虚拟环境 python -m venv venv# Windows激活虚拟环境 venv\Scripts\activate# Linux/Mac激活虚拟环境 sou…

Python练习(1)

一:英文字符频率统计。编写一个程序&#xff0c;对给定字符串中出现的a到z字母频率进行分析&#xff0c;忽略大小写采用降序方式输出 from collections import Counter import string def analyze_frequency(input_string): # 将字符串转换为小写以忽略大小写 input_…

Oracle 数据库执行增删改查命令的原理与过程

摘要&#xff1a; 本文深入探讨当向 Oracle 数据库发送一个增删改查&#xff08;CRUD&#xff09;命令时&#xff0c;数据库内部的执行机制与详细过程。从用户发起命令开始&#xff0c;逐步剖析命令在 Oracle 数据库体系结构各组件中的流转、解析、优化以及执行路径&#xff0c…

Samba服务器常见问题处理

指定的网络文件夹目前是以其他用户名和密码进行映射的。要用其他用户名和密码进行连接&#xff0c;首先请断开所有现有的连接到网络共享的映射 解决方案 单击“开始”菜单&#xff0c;选择“运行…”。 在弹出的窗口中&#xff0c;输入cmd 进入命令行模式&#xff0c;并输入…

vue学习11.27

监视属性 watch: { isHot:{ handler(){ } } } handler当isHot发生改变时调用。 watch: {isHot: {handler(newValue, oldValue) {console.log(修改了, newValue, oldValue);}}} 有什么用吗&#xff1a;例如new和oldvalue差值过大&#xff0c;本例子就意味着温差过大&…

六、Python —— 函数

文章目录 一、函数基础1.1、编写函数1.2、调用函数1.3、形参和实参1.3.1、形参的初始化方式1.3.2、带默认值的形参 1.4、变量的作用域1.5、嵌套定义函数1.6、pass 语句 二、参数传递2.1、值传递2.2、引用传递 三、return 语句四、lambda 表达式五、函数递归 一、函数基础 Pytho…

Linux下如何安装JDK

在Linux系统上安装JDK&#xff08;Java Development Kit&#xff09;&#xff0c;通常包括下面步骤&#xff1a; 下载JDK安装包解压安装包配置环境变量等 在介绍安装之前&#xff0c;先厘清一些常用问题。 Linux 下Java 安装到哪个目录比较好&#xff1f; 在Linux系统下&am…