最大子列和问题

最大子列和问题

前提

在遇到连续的正数和负数时, 显然我们可以将其合并,形成一个更大的正数或更小的负数。

因此我们得到一个正负相间的数组。舍去两端负数, 我们得到了一个两端为正数的数列,并且正数负数相间, 这个数列个数为奇数。并且很容易得到最大子数列包含的数目的个数也为奇数个。

分析

根据前面的简单合并,假定a是最左边的数,则 a > 0, 之后的数列为b。 通过分类可以知道,分析3种情况。 a的子列(就是a本身), b的子列, 横跨a、b边界的数列。
在这里插入图片描述

从b中拆出一个数, 剩下的数列为c。此时 b < 0, 将 a 和 b 看作一个数列在这里插入图片描述
1.若a + b < 0, a + b 数列的最大值为 a。c数列最大子列和待定。横跨 ab 和 c 边界的子列一定会因为加上 b 或者加上 a 和 b 变小, 不可能存在最大和。 因此最大子列和在 a 和 c 中选取。 求出 c 中最大子列和并于 a 比较即可。
2.若 a + b > 0, 继续从 c 中拆出一个正数(数列正负相间)。记录 a 的值为当前最大。由于a + b + “新拆出来的数” 一定是正数, 将其合并,视为一个正数即可(这是因为如果最大子列和包含新拆出来的数的话, 一定会包含 a 和 b)。然后寻找合并后的最大子列和。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值