Problem
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6
具体详见Leetcode
Analysis
首先明确题目要求的是子序列的和的最大值,而在此题的中子序列不能为空,所以如果所有的数都是负数的话,也不能不选。所以分两种情况。第一种情况是所以子元素都是负数,那么最大子序列的和是最大的那个负数的值。第二种情况是至少有一个正数,此时可以采用动态规划的方法来做。
动态规划方程为:
设
f(n)
为当前的最大子序列的和,
a[n]
表示当前的数组元素。
f(n)=max
{
0,f(n−1)+a[n]
}
然后取
f(n)
这个数组中的最大值,可是实时比较当前的max和
f(n)
.
Code
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> sumArray;
int max = nums[0];
if (nums[0] < 0) sumArray.push_back(0);
else sumArray.push_back(nums[0]);
for (int i = 1; i < nums.size(); i++) {
if (sumArray[i-1] + nums[i] < 0) {
sumArray.push_back(0);
}
else sumArray.push_back(sumArray[i-1] + nums[i]);
if (max < sumArray[i]) max = sumArray[i];
}
bool flags = false;
int nummax = nums[0];
for (int i = 0; i < nums.size(); i++) {
if (nums[i] > 0) flags = true;
if (nums[i] > nummax) nummax = nums[i];
}
if (!flags) max = nummax;
return max;
}
};
Complexity
时间复杂度:
O(n)
空间复杂度:
O(n)
本文解析了寻找具有最大和的连续子数组的问题,并提供了一种动态规划解决方案。通过实例说明了如何找到最大子数组和,同时分析了时间与空间复杂度。
212

被折叠的 条评论
为什么被折叠?



