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

诸神缄默不语-个人CSDN博文目录
力扣刷题笔记

在这里插入图片描述

在这里插入图片描述

文章目录

  • 1. 暴力搜索
  • 2. 动态规划
  • 3. 前缀和

1. 暴力搜索

直接用2个指针从索引0开始找到最后一个索引,时间复杂度大概是 O ( n 2 ) O(n^2) O(n2)吧,总之这么搞不行,以下是我用Python写的一些典型失败案例

class Solution:def maxAbsoluteSum(self, nums: List[int]) -> int:max_abs=0nums_len=len(nums)for pointer1 in range(nums_len):for pointer2 in range(pointer1,nums_len):sub_nums=nums[pointer1:pointer2+1]max_abs=max(max_abs,abs(sum(sub_nums)))return max_abs

↑会超时,这个我觉得应该是sum()的问题,所以做了改进:

class Solution:def maxAbsoluteSum(self, nums: List[int]) -> int:sum_table=[[0 for _ in range(len(nums))] for _ in range(len(nums))]for i in range(len(nums)):sum_table[i][i]=nums[i]for i in range(len(nums)):for j in range(i+1,len(nums)):sum_table[i][j]=sum_table[i][j-1]+nums[j]max_abs=0for i in sum_table:for j in i:max_abs=max(max_abs,abs(j))return max_abs

↑这个又会爆内存,我骂骂咧咧。
这个我一开始猜是因为0太多了,所以把所有一直都是0的部分给删除了:

class Solution:def maxAbsoluteSum(self, nums: List[int]) -> int:sum_table=[[0 for _ in range(len(nums)-i)] for i in range(len(nums))]for i in range(len(nums)):sum_table[i][0]=nums[i]for i in range(len(nums)):for j in range(1,len(nums)-i):sum_table[i][j]=sum_table[i][j-1]+nums[j+i]max_abs=0for i in sum_table:for j in i:max_abs=max(max_abs,abs(j))return max_abs

↑还是会爆内存
继续缩:

class Solution:def maxAbsoluteSum(self, nums: List[int]) -> int:max_abs=0for i in range(len(nums)):pre_sum=nums[i]max_abs=max(max_abs,abs(pre_sum))for j in range(i+1,len(nums)):pre_sum=pre_sum+nums[j]max_abs=max(max_abs,abs(pre_sum))return max_abs

这回超时了

2. 动态规划

然后我就去看题解了。

来自官方题解:https://leetcode.cn/problems/maximum-absolute-sum-of-any-subarray/solutions/2372374/ren-yi-zi-shu-zu-he-de-jue-dui-zhi-de-zu-qerr/

在一组数字中绝对值的最大值,可能是最大的值的绝对值,也可能是最小值的绝对值。
所以找子数组和绝对值的最大值,就要找最大的子数组和,和最小的子数组和。
所以解决方案是分别计算这两种情况:在找最大的子数组和时,遍历数组,保留到上一个数字为止的全局子数组最大和global_max+有上一个数字在的子数组的最大和sumable_max或者0(0的意思就是甩掉上一个数字),如果新数字+sumable_max比positiveMax还高,就更新global_max;如果这个数字加进sumable_max大于0了,那对后续数字而言,加sumable_max是可以更大的(我在说什么,反正就是这个意思),否则不如直接重开。
找最小的子数组和时就完全反过来:保留全局最小和global_min+可加最小和sumable_min或0,如果新数字+sumable_min<global_min就更新global_min;如果新数字+sumable_min>0那就白给,立刻重开。

时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

class Solution:def maxAbsoluteSum(self, nums: List[int]) -> int:global_max=0sumable_max=0global_min=0sumable_min=0for i in nums:sumable_max+=iglobal_max=max(global_max,sumable_max)sumable_max=max(0,sumable_max)sumable_min+=iglobal_min=min(global_min,sumable_min)sumable_min=min(0,sumable_min)return max(abs(global_max),abs(global_min))

官方Java代码:

class Solution {public int maxAbsoluteSum(int[] nums) {int positiveMax = 0, negativeMin = 0;int positiveSum = 0, negativeSum = 0;for (int num : nums) {positiveSum += num;positiveMax = Math.max(positiveMax, positiveSum);positiveSum = Math.max(0, positiveSum);negativeSum += num;negativeMin = Math.min(negativeMin, negativeSum);negativeSum = Math.min(0, negativeSum);}return Math.max(positiveMax, -negativeMin);}
}

3. 前缀和

前缀和指的是在数组最前面加个0(没这个的话一个子数组没法是最大的前缀和本身了),从第1个数字到当前数字的和,任何子数组和显然都是某2个前缀和的差值,最大的子数组和绝对值显然就是最大前缀和-最小前缀和

Python 3有内置函数:

class Solution:def maxAbsoluteSum(self, nums: List[int]) -> int:s = list(accumulate(nums, initial=0))  # nums 的前缀和return max(s) - min(s)

Java实现的示例:

class Solution {public int maxAbsoluteSum(int[] nums) {int n=nums.length;int pre=0;int max=0;int min=0;for(int i=0;i<n;i++){pre+=nums[i];max=Math.max(max,pre);min=Math.min(min,pre);}return max-min;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/58639.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python web实战之Django 的 RESTful API 设计详解

关键词: Python, Web 开发, Django, RESTful API 1 API的一些事儿 1.1 什么是API&#xff1f; API是应用程序编程接口&#xff08;Application Programming Interface&#xff09;的缩写。它是一种定义了不同软件组件之间交互方式的规范。API允许不同的应用程序之间进行通信和…

04-4_Qt 5.9 C++开发指南_时间日期与定时器

文章目录 1. 时间日期相关的类2. 源码2.1 可视化UI设计2.2 dialog.h2.3 dialog.cpp 1. 时间日期相关的类 时间日期是经常遇到的数据类型&#xff0c;Qt 中时间日期类型的类如下。 QTime:时间数据类型&#xff0c;仅表示时间&#xff0c;如 15:23:13。 QDate:日期数据类型&…

【uniapp 小程序开发语法篇】资源引入 | 语法介绍 | UTS 语法支持(链接格式)

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; uni-app | 小程序开发 开发工具&#xff1a;HBuilderX 小程序开发语法篇 引用组件easycom Js文件引入NPM支持 Css文件引入静态资源引入css 引入静态资源如何引入字体图标&#xff1f;css 引入字体图标示例nvue 引入字体…

OceanBase 4.1.0 clog 目录探究

基于OceanBase 4.x 版本如何统计租户每日 clog 日志生成量的背景下&#xff0c;探究以及如何查看租户 clog 的使用情况。 作者&#xff1a;姜宇 爱可生 DBA 团队成员&#xff0c;擅长数据库故障排查和处理。对技术抱有热忱&#xff0c;实践是检验真理的唯一标准~ 本文来源&…

java之junit Test

JUnit测试简介 1.什么是单元测试 单元测试是针对最小的功能单元编写测试代码Java程序最小的功能单元是方法单元测试就是针对单个Java方法的测试 2.测试驱动开发 3.单元测试的好处 确保单个方法运行正常如果修改了方法代码&#xff0c;只需确保其对应的单元测试通过测试代码…

JAVA SE -- 第十六天

&#xff08;全部来自“韩顺平教育”&#xff09; IO流 一、文件 是保存数据的地方 2、文件流 文件在程序中是以流的形式来操作 流&#xff1a;数据在数据源&#xff08;文件&#xff09;和程序&#xff08;内存&#xff09;之间经历的路径 输入流&#xff1a;数据从数据…

【docker】设置 docker 国内镜像报错问题,解决方案

一、报错&#xff1a; [rootlocalhost ~]# systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.二、原因&#xf…

4.时间与窗口

4.1 时间类型 在Flink中定义了3种时间类型&#xff1a; 事件时间&#xff08;Event Time&#xff09;:事件的发生事件&#xff0c;数据本身自带时间字段。处理时间&#xff08;Processing Time&#xff09;&#xff1a;计算引擎处理时的系统时间。和摄取时间&#xff08;Inge…

使用RecyclerView构建灵活的列表界面

使用RecyclerView构建灵活的列表界面 1. 引言 在现代移动应用中&#xff0c;列表界面是最常见的用户界面之一&#xff0c;它能够展示大量的数据&#xff0c;让用户可以浏览和操作。无论是社交媒体的动态流、商品展示、新闻列表还是任务清单&#xff0c;列表界面都扮演着不可或…

TCP 三次握手,四次挥手

1、三次握手 第一次握手 SYN 等于1&#xff0c;SeqX 第二次握手 SYN等于1 ACK等于1&#xff0c;SeqY&#xff0c;AckX1 第三次SYN等于0 ACK等于1&#xff0c;SeqX1&#xff0c;AckY1 ackRow都是对应请求seqraw&#xff0c;三次握手后&#xff0c;Seq就是服务器前一个包中的ac…

VIM 编辑器: Bram Moolenaar

VIM 用了很长时间&#xff0c; 个人的 VIM 配置文件差不多10年没有更新了。以前写程序的时候&#xff0c; 编辑都用这个。 linux kernel&#xff0c; boost规模的代码都不在话下。现在虽然代码写的少了&#xff0c;依然是我打开文件的首选。 现在用手机了&#xff0c;配个蓝牙键…

【80天学习完《深入理解计算机系统》】第二天 2.2 整数的表示【有符号数,无符号数,符号数的扩展,有无符号数的转变】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…