暴力法
穷举出所有情况,找出最大情况。由于是连续子数组,用两层循环即可。第一层用来控制边界,第二层用来计算子数组的和。
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int max=-100000;
for(int i=0;i<array.size();i++)
{
int j=i;
int sum=0;
while(j<array.size())
{
sum = sum+array[j];
if(sum>max)
{
max = sum;
}
j++;
}
}
return max;
}
};
2 动态规划
定义dp[j] 表示以元素j结尾的连续子数组的最大和,
参考别人的理解,以这个数结尾,那么意味着这个数一定会加上去,那么要看的就是这个数前面的部分要不要加上去。大于零就加,小于零就舍弃。
那么状态转移方程如下
含义为,如果以元素j-1结尾的连续子数组的最大和dp[j-1] 小于0的话,不如就只考虑j这个数就行了。
class Solution {
public:
int FindGreatestSumOfSubArray(vector<int> array) {
int MAX = array[0];
vector<int> dp(array.size());
dp[0] = array[0];
for(int i=1;i<array.size();i++)
{
dp[i] = max(dp[i-1],0)+array[i];
if(dp[i]>MAX)
MAX = dp[i];
}
return MAX;
}
};