每日编程28之求最大子数组(o(N)复杂度)

本文介绍了如何在O(N)的时间复杂度内找到数组中和最大的子数组。通过遍历数组,记录最大子数组的起始位置、结束位置和当前和,当遇到负数时判断是否更新最大子数组。文中还指出并修正了原始代码中的逻辑问题,提供了一个正确实现的代码示例。
摘要由CSDN通过智能技术生成

之前研究算法,还剩下三大难题——KMP,rb-tree和DP。。

本来是想把DP这一遗留问题解决,就看到了这个问题,后面才发现这个问题其实很简单,完全用不到动态规划的思想,或者是最简单的一维DP。


问题描述,

一个数组,n个元素,有正有负

求最大子数组,要求o(N)复杂度

例如,输入数组为 1,-2,3,10,-4,7,2,-5  则和最大的子数组为3,10,-4,7,2


解决方案

对数组进行一次遍历,在遍历的过程中记录一些信息,并不断的更新这一信息。包括

目前最大子数组的起始位置,结束位置,子数组和

当前正在遍历的子数组起始位置,当前位置,当前的和。。

若遍历到数组的某一元素,当前和为负,则丢弃当前子数组,从下一个元素开始重新计算

若当前遍历元素<0,则尝试比较当前子数组与历史最大子数组,决定是否进行更新

在数组遍历结束后,比较当前子数组与历史最大子数组,决定最后的结果输出。


核心代码如下,

int max_sub_array(int a[],int N,int &left,int &right,int &max) //初始时,left=right=max=0

{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值