@@ -222,19 +222,32 @@ class Solution {
222
222
// 版本三:一维 dp数组
223
223
class Solution {
224
224
public int maxProfit (int k , int [] prices ) {
225
- // 在版本二的基础上,由于我们只关心前一天的股票买入情况,所以只存储前一天的股票买入情况
226
- if (prices. length== 0 )return 0 ;
227
- int [] dp= new int [2 * k+ 1 ];
228
- for (int i = 1 ; i < 2 * k ; i+= 2 ) {
229
- dp[i]= - prices[0 ];
225
+ if (prices. length == 0 ){
226
+ return 0 ;
230
227
}
231
- for (int i = 0 ; i < prices. length ; i++ ) {
232
- for (int j = 1 ; j < 2 * k ; j+= 2 ) {
233
- dp[j]= Math . max(dp[j],dp[j- 1 ]- prices[i]);
234
- dp[j+ 1 ]= Math . max(dp[j+ 1 ],dp[j]+ prices[i]);
228
+ if (k == 0 ){
229
+ return 0 ;
230
+ }
231
+ // 其实就是123题的扩展,123题只用记录2天的状态
232
+ // 这里记录k天的状态就行了
233
+ // 每天都有买入,卖出两个状态,所以要乘 2
234
+ int [] dp = new int [2 * k];
235
+ // 按123题解题格式那样,做一个初始化
236
+ for (int i = 0 ; i < dp. length / 2 ; i++ ){
237
+ dp[i * 2 ] = - prices[0 ];
238
+ }
239
+ for (int i = 1 ; i <= prices. length; i++ ){
240
+ dp[0 ] = Math . max(dp[0 ], - prices[i - 1 ]);
241
+ dp[1 ] = Math . max(dp[1 ], dp[0 ] + prices[i - 1 ]);
242
+ // 还是与123题一样,与123题对照来看
243
+ // 就很容易啦
244
+ for (int j = 2 ; j < dp. length; j += 2 ){
245
+ dp[j] = Math . max(dp[j], dp[j - 1 ] - prices[i- 1 ]);
246
+ dp[j + 1 ] = Math . max(dp[j + 1 ], dp[j] + prices[i - 1 ]);
235
247
}
236
248
}
237
- return dp[2 * k];
249
+ // 返回最后一天卖出状态的结果就行了
250
+ return dp[dp. length - 1 ];
238
251
}
239
252
}
240
253
```
0 commit comments