题目描述
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1] 输出:1
示例 3:
输入:nums = [5,4,-1,7,8] 输出:23
方法一:动态规划dp
用数组tem[i]存储以a[i]为结尾的连续最大连续子数组和:
因为需要考虑到4,-1,2这样的情况,所以说从左向右去决定是否添加后面的元素不合适,而若以a[i]为基准,那么它前面的数都是确定的情况。因而以a[i]为基准,去找它左边最大的连续子数组,若它左边的连续最大子数组tem[i]小于0,那么则没有必要去加上前面的数。每求得一个以a[i]为结尾的连续最大子数组,我们便做一次记录,保留较大值。直到考虑完最后一个元素,即可求得最大子数组和
#include<bits/stdc++.h>//
using namespace std;
vector<int>a;
const int N = 1e5 + 5;
int tem[N];
int main() {
int num,max_addition;
while (1) {
cin >> num;
a.push_back(num);
if (cin.get() == '\n') break;
}
max_addition = 0;
tem[0] = a[0];//防止第一个数加不上
if (a.size() == 1) cout << a[0];
else {
for (int i = 1; i < a.size(); i++) {
tem[i] = (tem[i - 1] >= 0) ? tem[i - 1] + a[i] : a[i];
max_addition = max(max_addition, tem[i]);
}
cout << max_addition;
}
return 0;
}
结果
1
1
-2,1,-3,4,-1,2,1,-5,4
6
5,4,-1,7,8
23
题目来源: