求连续子数组的最大和,并记录其起始结束位置

给定一个整型数组,需找到其中连续子数组的最大和,并记录起始和结束位置。采用动态规划思想,已知(A[k]...A[n-1])的最大子数组和All[k]和包含A[k]的最大子数组和Start[k],通过递推公式All[k-1]=max{A[k-1], A[k-1]+Start[k], All[k]},从前向后计算,实现O(n)的时间复杂度解决方案。" 72417057,6679886,二维数组与二级指针详解,"['C语言', '指针', '数组', '数据结构']
摘要由CSDN通过智能技术生成

问题描述:输入一个整型数组,数组里面有正数也有负数。数组中一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

问题分析:
相信我们最直观的做法就是依次遍历出所有子数组的和,选出最大的,这种做法的最好的时间复杂度都是O(n^2)。不符合题目的要求。
换一种思路,我们采用分治法来分析,数组(A[0],A[1],...A(n-1)分为长度相等的两段数组(A[0],...,A[n/2-1])以及(A[n/2],...,A[n-1]),分别求出这两段数组各自的最大子段和,则原数组(A[0],A[1],...A(n-1)的最大子段和分为3种情况
1).(A[0],A[1],...A(n-1)的最大子段和与(A[0],...,A[n/2-1])的相同
2).(A[0],A[1],...A(n-1)的最大子段和与(A[n/2],...,A[n-1])的相同
3).(A[0],A[1],...A(n-1)的最大子段和跨过(A[0],...,A[n/2-1])与(A[n/2],...,A[n-1])-
1)和2)可以根据递归可得,3)只要计算出以A[n/2-1]为结尾的一段数组最大和s1=Sum1[i...n/2-1]和A[n/2]为开头一段数组最大和s2=Sum2[n/2...j],最后s=s1+s2.
这个算法满足分治算法递归,总的时间复杂度O(N*log2N)

这种分治的思想已经将时间复杂度有了很大的提升,但是还是没有达到题目要求的O(n),我们继续分析,假设我们已经知道(A[k].....A[n-1])最大的一段数组和为All[k],并且已经计算出在(A[k].....A[n-1])中包含A[k]的最大的一段数组和为Start[k],那么可以推断出All[k-1]=max{A[k-1],A[k-1]+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值