数据结构与算法 最大子序列求和问题 分治算法实现

使用分治算法 解决最大子序列求和问题(Java语言实现)

算法问题描述

给定一个数组,通过程序得到其中连续索引上值的最大和

算法分析过程

问题描述很简单,对于该问题本身,最容易想到的是暴力法,直接两次循环算出数组的每一个子数组的和,然后返回其中的最大值,这种实现的时间复杂度是O(N2),这对于少量输入来说,是可以接受的。但算法,肯定是时间上越短越好,空间上占用的内存越少越好,所以为了效率的提高,分治算法是一个很好的解决办法。
分治算法的思想是将一个大的问题分解成小的问题,然后得到这些小问题的解法之后,将它们组合成大问题的解法。
对于数组来说,其连续索引的值的最大和会出现在三个地方,数组的左边,数组的右边,和数组的中间部分。乍一看好像这是废话,但这就是我们要分解问题的思路。我们可以将数组分解成两个部分,左半部和右半部,然后递归地去计算两个子数组的连续最大和,所以我们在调用方法的时候需要传入上下两个边界。然后对于中间的部分,我们需要额外在每一次递归中进行计算。通过中间向两侧遍历,记录住得到的最大和。然后对于递归的情形,我们要定义好它的基准情形(base case), 当上边界和下边界相等时,说明程序已经递归到只有一个元素的子数组了,这时如果值大于0就返回,小于0则不选中。(这里我们定义,如果数组中所有的元素都是负数,则连续最大子序列为空,返回0)

算法实现

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值