【剑指offer】40.连续子数组的最大和

总目录:

算法之旅导航目录

 

1.问题描述

输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。
数据范围:
1<=n<=2×10^5
−100<=a[i]<=100
要求:时间复杂度为 O(n),空间复杂度为 O(n)

进阶:时间复杂度为 O(n),空间复杂度为 O(1)

注意这个子数组有可能是会跨过负数的,就看值得不值得,如:输入:[1,-2,3,10,-4,7,2,-5]返回值:18说明:经分析可知,输入数组的子数组[3,10,-4,7,2]可以求得最大和为18

 

 

2.问题分析

 1动态规划,设dp[n]是以n元素为中止的连续序列的最大和,对于dp[n-1]则有

若dp[n-1]>0,则dp[n]=dp[n-1]+array[n],因为加上一个大于零的数会变大,

若dp[n-1]<0,则dp[n]=0+array[n],因为加上一个小于零的数会变小,此时dp[n]变成了以array[n]同时为起点和终点的连续序列的最大和。

在取最大和时,遍历dp即可

人生哲理:如果过往是包袱则丢掉包袱重新出发,如果过往是经验则更上一层楼


3.代码实例

动态规划

 1 class Solution {
 2   public:
 3     int FindGreatestSumOfSubArray(vector<int> array) {
 4         int dataSize = array.size();
 5         if (dataSize <= 0) {
 6             return 0;
 7         }
 8 
 9         int maxSum = array[0];
10         for (int i = 1; i < dataSize; i++) {
11             array[i] += array[i - 1] > 0 ? array[i - 1] : 0;
12             maxSum = array[i] > maxSum ? array[i] : maxSum;
13         }
14 
15         return maxSum;
16     }
17 };
View Code

 

posted @ 2022-11-19 17:34  啊原来是这样呀  阅读(27)  评论(0)    收藏  举报