题目
输入一个整型数组,数组里有正数也有负数。数组的一个或连续多个整数组成一个子数组。求所有子数组的最大和。要求时间复杂度为O(n)
思路一
试着从头到尾累加每个数字,若发现有子数组和小于零,则加上后面的数字肯定会变小
因此丢弃这组子数组,从后面一个数字开始重新累加
例如{1,-2,3,10,-4,7,2,-5}
1+(-2)=-1
3+10-4+7+2=18
3+10-4+7+2-5=13
因此是18
需要注意的是,记录最大值的初始值要设置成INT_MIN,因为最大值可能是负数。
class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) { if (array.size() == 0) return 0; // 数组中最大值可以是负数,因此最大值不能设成0 int sum = 0, max = INT_MIN; int len = array.size(); for (int i = 0; i < len; i++){ if (sum < 0){ sum = array[i]; // 从下一个数字开始累加 } else { sum = sum + array[i]; } if (sum > max){ // 记录最大值 max = sum; } } return max; } };
思路二
也可以用动态规划做,其实和前面思想类似。
用f(i)表示以i结尾的子数组最大和
class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) { if (array.size() == 0) return 0; int f = array[0], sum = array[0]; for (int i = 1; i < array.size(); i++){ if (f <= 0) f = array[i]; else f = f + array[i]; sum = (f > sum)? f: sum; } return sum; } };
原文地址:https://www.cnblogs.com/shiganquan/p/9346322.html
时间: 2024-10-09 01:22:07