【剑指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 };
 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号