解题思路
如果用简单的解法,那只需要遍历两次,时间复杂度取O(N^2)即可,但如果想将时间复杂度降低到线性,那需要用到动态规划的方法。
设preSub[i]为在index i前(包括字符i)的连续子串最大和,则preSub[i] = max{preSub[i - 1] + nums[i],nums[i]}, preSub[nums.size() - 1] 即为所求。
代码
const int MAX_N = 1000;
int maxSubArray(vector<int>& nums) {
int maxSub = nums[0];
int preSub = nums[0];
for (int i = 1; i < nums.size(); i++) {
if (preSub + nums[i] >= 0) {
preSub = max(preSub + nums[i], nums[i]);
maxSub = max(preSub, maxSub);
} else {
preSub = nums[i];
maxSub = max(preSub, maxSub);
}
}
return maxSub;
}