所谓最大子数组,是原数组中连续数组元素之和最大的数组元素集合。比如买股票。如果把股票两天的价格差作为一个数组元素,那么在连续的一段时间内寻找股票的最佳买入时间和最佳卖出时间就可以抽象为计算最大子数组的问题。
例如,一家公司股票的价值如下。第一天的价值是10元。初二11元,初三7元,初四10元,初五6元。最大收益要在第三天买入,第五天卖出的问题可以简化为第二天-第一天=1,第三天-第二天=-4,第四天-第三天=3,第五天-第四天=-4。最大的收入应该是3,这是这个数组中最大的子数组。
假设我们正在寻找一个[low,,,high]的最大子数组,使用分而治之技术意味着我们将子数组分成两个尽可能大的子数组,也就是子数组中间的mid,然后考虑求解两个子数组a[low,,,mid],a[mid+1,,high]。[low,,,high]的任何连续子数组a[i,,,j]必须处于以下三种情况之一
可以参考下面的分而治之法来解决最大子数组问题
分析
状态定义:设置动态编程列表dp,dp“i”表示以元素编号“i”结尾的连续子数组的最大和
如果dp“i-1”<=0,则dp“i-1”对dp“i”有负效应,即dp“i-1”+数“i”小于数“i”本身
初始状态dp“0”=数字“0”,以数字“0”结尾的连续子数组的最大和是数字“0”
返回dp动态列表中的最大值。
空间复杂性降低:因为dp[i]仅与dp[
I1]与数字[i]有关,所以可以将原来的数组nums用作dp列表,即可以直接对nums进行修改,由于省略了dp列表使用的额外空间,空间复杂度从O(N)降低到O(1).
Java代码实现: