持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
今天,我们继续搞算法。
题目描述
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
题目分析
啥度不会的话,就写个解叭.
然后,我们开始分析,输入参数是一个数组,数组里是啥呢?是每天的交易股票的价格,因为每天的价格度在变,所以我们选择股票的策略度是不同的,我们一共有这么三种策略要么买,买什么时候买呢?股票跌的时候,要么卖,卖是什么时候卖呢?就是涨的时候,或者不动。那么这个每天的股票的价格可以当成一个状态,因为是变化的。
那我们就想第i天,我们怎么交易?由于题目要求我们持仓数是只能有1个,因此,我们就得关注仓位,我们的仓位也有两个状态,要么持仓,要么空仓,我们可以用0代表空仓,1代表持仓。那我们就需要一个二维数组表示第i天我们的收益,我们的收益计算如下:
- 第i天买入股票:f[i][1] = max(f[i][1],f[i-1][0]-prices[i])
- 第i天卖出股票:f[i][0] = max(f[i][0],f[i-1][1]+prices[i])
- 第i天不动: f[i][j] = max(f[i][j],f[i-1][j])
代码如下
class Solution {
public int maxProfit(int[] prices) {
int[] tempPrices = new int[prices.length+1];
int n = prices.length;
tempPrices[0] = 0;
for (int i = 0; i < n; i++) {
tempPrices[i+1] = prices[i];
}
int[][] f = new int[n+1][2];
for (int i = 0; i < f.length; i++) {
f[i][0] = (int)-1e9;
f[i][1] = (int)-1e9;
}
f[0][0] = 0;
for (int i = 1; i <= n; i++) {
f[i][1] = Math.max(f[i][1], f[i - 1][0] - tempPrices[i]);
f[i][0] = Math.max(f[i][0], f[i - 1][1] + tempPrices[i]);
for (int j=0;j<2;j++){
f[i][j] = Math.max(f[i][j], f[i - 1][j] );
}
}
return f[n][0];
}
}