【2025刷题笔记】- 分割数组的最大差值

刷题笔记合集🔗

分割数组的最大差值

问题描述

给定一个由若干整数组成的数组 ,可以在数组内的任意位置进行分割,将该数组分割成两个非空子数组(即左数组和右数组),分别对子数组求和得到两个值,计算这两个值的差值,请输出所有分割方案中,差值最大的值。

输入格式

第一行输入数组中元素个数
第二行输入数字序列,以空格进行分隔,数字取值为 4 字节整数。

输出格式

输出差值的最大取值。

样例输入

6
1 -2 3 4 -9 7

样例输出

10

数据范围

  • 数组元素为 4 字节整数
样例 解释说明
样例1 将数组 nums 划分为两个非空数组的可行方案有:
左数组 = [1] 且 右数组 = [-2,3,4,-9,7],和的差值 = |1 - 3| = 2
左数组 = [1,-2] 且 右数组 = [3,4,-9,7],和的差值 = |-1 - 5| = 6
左数组 = [1,-2,3] 且 右数组 = [4,-9,7],和的差值 = |2 - 2| = 0
左数组 = [1,-2,3,4] 且右数组 = [-9,7],和的差值 = |6 - (-2)| = 8
左数组 = [1,-2,3,4,-9] 且 右数组 = [7],和的差值 = |-3 - 7| = 10
最大的差值为10

题解

这道题要求在数组的任意位置分割,形成两个非空子数组,然后求它们和的差值的最大值。

解决这个问题的关键是了解如何高效计算每个分割点的差值。一个直观的思路是枚举所有可能的分割点,计算左右子数组的和,取差值的最大值。

由于需要遍历所有分割点,时间复杂度至少是O(n)。但如果每次都重新计算左右子数组的和,时间复杂度会增加到O(n²),这对于n最大为100000的情况可能会超时。

更高效的方法是提前计算整个数组的总和sum,然后从左到右遍历数组,维护一个变量leftSum表示当前左子数组的和。对于每个分割点i,右子数组的和就是rightSum = sum - leftSum。差值就是|leftSum - rightSum|。

算法步骤:

  1. 计算整个数组的总和sum
  2. 初始化leftSum = 0, maxDiff = 0
  3. 遍历数组的前n-1个元素(因为右子数组至少要有一个元素)
  4. 对于每个元素i:
    • 更新leftSum += nums[i]
    • 计算rightSum = sum - leftSum
    • 计算差值diff = |leftSum - rightSum|
    • 更新maxDiff = max(maxDiff, diff)
  5. 返回maxDiff

这个算法的时间复杂度是O(n),空间复杂度是O(1),对于给定的数据范围是完全可行的。

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()

# 读取输入
n = int(input())
nums = list(map(int, input().split()))

# 查找最大差值
def find_max_diff(arr):
    """计算分割数组可得到的最大差值"""
    # 计算整个数组的总和
    total = sum(arr)
    
    left_sum = 0
    max_diff = 0
    
    # 遍历前n-1个元素(最后一个元素必须在右侧子数组)
    for i in range(len(arr) - 1):

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

国际商业化产品与技术-测试开发实习生(面向2027届毕业生)团队介绍:国际商业化产品与技术团队支持字节跳动国际产品的广告产品与变现技术。我们负责end2end的大型广告系统建设,为客户提供商业推广方式与方案。我们的团队遍布北京、上海、美国、新加坡等地,在这里你将有机会开阔自己的国际化视野,接触到全球领先的商业产品架构、模型和算法,并有机会参与并推动互联网广告行业的创新和变革。职位描述:1、深度参与商业变现测试开发工作;2、负责Web/Server/客户端产品的业务相关测试;3、对测试过程中发现的问题进行跟踪分析和报告;负责跟进Bug迭代进程,积极主动与产品、技术沟通,及时合理的解决测试中发现的问题;4、完成产品的集成测试、系统测试,以及必要的自动化测试、性能测试;5、推动并监控整个项目流程的实施,评估项目风险,推动问题的解决,保障产品质量。职位要求:1、本科及以上学历在读,计算机等相关专业优先;2、能熟悉以下一门或几门语言优先:Python/Go/Java;Linux/Shell;3、热爱软件测试开发工作,工作细致认真,有耐心;4、沟通表达能力强,快速理解工程和产品的细节;5、有大规模系统测试开发经验者优先,熟悉计算广告,或者有相关测试开发经验者优先。6、每周出勤至少4天,可实习4个月以上有兴趣欢迎先私聊我,私聊后发字节邮箱验证真伪主要就我派活,不搞心态,友好相处共同做牛马。这个岗位工作压力较大(我自己是1095左右,不要求实习生早来晚走,活干完之后早走完全ok),没有转正名额,干的好了我辞职让贤。希望也别搞我心态,互相理解互相尊重,打工人不互相为难。可能的收获:对go语言会有较大加强,一起写端到端的复杂的自动化case,以及数据校验的流程。会对业务有比较深入的理解。对python小幅加强,单接口的case比较多国际同事很多,对各国风土人情感兴趣的话会是个不错的机会广告业务的核心流程会对你开放,有一些东西还蛮有意思,一个视频从制作到投广,怎么找到为它付费的人,怎么找到受众,怎么算钱balabala...反正了解新东西吧,有点增量不纯搬砖一些职场通用能力和福利,字节有很多好玩的工具功能,甚至还包括心理咨询呀gemini额度呀可以来薅
投递字节跳动等公司7个岗位
点赞 评论 收藏
分享
12-14 09:20
门头沟学院 Java
1.项目介绍2.说一下你在里面参与的业务流程吗,整个系统3. 为啥会选用netty做这个二进制流的解码跟这个传输的一个框架呢?之前有没有评估过别的网络框架4.你的上游是什么模块,上游是怎么给你推二进制流的5.你的行情模块接入层是单体的吗?6.你们的ConcurrentHashMap是怎么设计的?这个Map 存在一台机器上,其他机器要用怎么办?7.如果这个 Map 丢了,比如服务重启了,数据怎么恢复8.如果单纯是存历史数据风控要用,那你Map只存最新的?那风控历史数据从哪查9.你们是写入Map后异步写Redis,对吧?那中间宕机了,Redis还没写成功,这条数据不就丢了?你们怎么保证数据不丢?10.你觉得 Redis 是强可靠的吗?如果 Redis 挂了你们怎么办11.什么是长连接?NIO 和 BIO 的区别讲一下吧12.所有上游都能跟你建立长连接吗?有没有场景不能建立长连接?那你们怎么处理?13.前面你说到的短连接和长连接混用,那这种情况下顺序怎么保证?有没有旧数据覆盖新数据的问题14.那如果你这边有多台机器,同时处理请求,怎么保证同一条行情数据不会被覆盖?顺序怎么保证?15.RocketMQ 是在哪一段用的?是在接入层之后就直接发MQ了吗16. MQ是怎么做分区的,你提到要隔离,那你只是broker隔离,消费端没有做隔离的话有啥意义17.MQ发消息用线程池是吧?那线程池参数是怎么配置的18.业务里为啥要用一个Map缓存行情?不是直接往下推就好了吗,还有你这个Map有没有读的链路?如果没有get操作,这个Map的存在意义在哪19. 那你说你重启后需要恢复数据,如果我们不用ChronicleQueue、Disruptor这些WAL预写,只用 Redis + MySQL,你怎么设计才能保证数据可靠20. Redis双机房是怎么做容灾的?同步是强同步还是异步的?中间挂了数据丢不丢21.有没有幂等场景?比如别人调你下单接口,你怎么实现幂等?是怎么返回给上游的22. 重试的时候你幂等怎么保证?怎么区分要返回什么呢23.问个MySQL的问题,MySQL里面那个b➕树它是双向链表还是单向链表,为什么24.手撕:1.给你一个数组,比如 [5,7,1,2,10],表示二叉树中序遍历的结果是节点 1,2,3,4,5,它们对应的分数分别是 5,7,1,2,10。2.要在所有符合这个中序顺序的二叉树中,找到“加分”最高的那棵
查看24道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务