最大字序即在给出的一个序列中找到连续相加最大的一个子序,这个子序列不能断开。
如:在
-1 -2 -3 4
这个序列中找连续相加最大的,即结果为4
总的来说 问题的关键就是要比较当前这个数和加上这个数的和之间的大小:
若加和小于当前这个数,就说明前面相加的可以舍弃了,从当前再次开始计算;
若加和大于当前这个数,就说明可以继续扩展相加了。
代码示例如下
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int* num = new int[n];
for (int i = 0; i < n; i++) {
cin >> num[i];
}
int max_sum = num[0];
int cur_sum = num[0];
for (int i = 1; i < n; i++) {
cur_sum = max(cur_sum + num[i], num[i]);
max_sum = max(max_sum, cur_sum);
}
cout << max_sum << endl;
return 0;
}
这个代码的时间复杂度是O(n)
代码思路
创建两个变量max_sum和cur_sum,分别用来记录最终结果需要的最大值,当前值和加和值对比之下的最大值。
只需要遍历一次,不需要管如果舍弃之前加和后要从当前位置对应的角标再开始计算,直接利用cur_sum来记录即可。