剑指Offer 连续子数组的最大和
题目描述
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?
思路:
从头开始,一个个加,ans<0 ,抛弃前面的,从当前位置开始往后加。记录max
注意初始值,可能存在全为负的情况。
1 class Solution { 2 public: 3 int FindGreatestSumOfSubArray(vector<int> array) { 4 if(array.empty()) 5 return 0; 6 7 int ans,max; 8 9 ans=0; 10 max=array[0]; 11 for(int i=0;i<array.size();i++) 12 { 13 if(ans<0) 14 ans=array[i]; 15 else 16 ans+=array[i]; 17 18 if(max<ans) 19 max=ans; 20 } 21 22 return max; 23 24 } 25 };
另外一种动态规划的思路:
max[f[i]) 即是最大连续子数组的和
1 class Solution: 2 def FindGreatestSumOfSubArray(self, array): 3 if not array: 4 return 0 5 6 dp = [array[0]] 7 8 i = 1 9 for num in array[1:]: 10 if dp[i - 1] <= 0: 11 dp.append(num) 12 else: 13 dp.append(dp[i - 1] + num) 14 i += 1 15 16 return max(dp)