股票买卖
题目描述
给定一个长度为 $N$ 的数组,数组中的第 $i$ 个数字表示一个给定股票在第 $i$ 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
输入格式
第一行包含整数 $N$,表示数组长度。
第二行包含 $N$ 个不大于 $10^9$ 的正整数,表示完整的数组。
输出格式
输出一个整数,表示最大利润。
数据范围
$1 \\le N \\le 10^5$,
输入样例1:
6
7 1 5 3 6 4
输出样例1:
5
输入样例2:
5
7 6 4 3 1
输出样例2:
0
样例解释
样例1:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为你不能在买入股票前卖出股票。
样例2:在这种情况下, 不进行任何交易, 所以最大利润为 0。
算法
贪心算法
- 从左到右枚举在哪一天卖出$i$,并记录前$i-1$天的最小值$minv$,在该天卖出
- 更新最大值$res=max(res,p[i]-minv)$
时间复杂度
$O(n)$
代码
#include <iostream>
#include <climits>
using namespace std;
int n;
int main()
{
scanf("%d", &n);
int res = 0;
for(int i = 0, minv = 2e9; i < n; i ++)
{
int p;
scanf("%d", &p);
res = max(res, p - minv);
minv = min(minv, p);
}
printf("%d", res);
return 0;
}