kadane’s算法
1.1一维kadane’s算法
题目:最大利润区间(最大连续子序列和)
背景:
小明是一个股票交易员。他有一份记录了某只股票在连续N天中的每日利润(可能为正,也可能为负)。小明想要知道在这N天中,他如果选择一个连续的交易区间,最多能获得多少利润。
问题:
给定一个长度为N的整数数组,表示股票在N天中的每日利润。请计算可以获得的最大连续利润。如果不可能获得正利润,则输出0。
输入格式:
第一行包含一个整数N(1 ≤ N ≤ 100000),表示天数。
第二行包含N个整数,每个整数的绝对值不超过10000,表示每天的利润。
输出格式:
输出一个整数,表示最大连续利润。如果不可能获得正利润,输出0。
样例输入:
8
-2 -3 4 -1 -2 1 5 -3
样例输出:
7
解释:
最大利润区间为第3天到第7天,总利润为4 + (-1) + (-2) + 1 + 5 = 7。
提示:
考虑使用Kadane算法来解决这个问题。
注意处理全是负数的情况。
(1)题目解析
#include <iostream>
#include <vector>
#include <algorithm>
typedef long long ll;
using namespace std;
ll maxProfit(const vector<ll>& profits) {
ll max_so_far = 0; // 初始化为0,因为如果全是负数,我们选择不交易
ll max_ending_here = 0;
bool all_negative = true;
for (ll profit : profits) {
if (profit > 0) all_negative = false;
max_ending_here = max(profit, max_ending_here + profit);
max_so_far = max(max_so_far, max_ending_here);
}
// 如果全是负数,返回0
return all_negative ? 0 : max_so_far;
}
int main() {
ll N;
cin >> N;
vector<ll> profits(N);
for (ll i = 0; i < N; ++i) {
cin >> profits[i];
}
cout << maxProfit(profits) << endl;
return 0;
}