dcddc

西米大人的博客

0%

买卖股票的最佳时机II

题目描述

假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。

思路

贪心。
一开始认为买卖点都在头部,向后遍历

  • 当出现卖点时,更新卖点和当前利润
  • 未出现卖点,将当前利润累加到总利润中,并将买点指向当前点(完成了一次交易,为下次交易做准备)
    即,只要发生利润A > 利润B,就卖掉利润A,开始下一次交易,这样每次操作都保证了利润的最大化,同时还为下一次交易做了准备

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public int maxProfit(int[] prices) {
int res = 0;
int sell = 0;
int buy = 0;
int tmpMax = 0; // 当前这笔交易的最大利润
for(int i = 1; i < prices.length; i++) {
if((prices[i] - prices[buy] >= tmpMax)) { // 当前交易出现更好的卖点,更新
tmpMax = prices[i] - prices[buy];
sell = i;
if(i == prices.length-1) { // 如果是最后一个交易日,卖出股票
res += tmpMax;
}
}else { // 当前交易完成,为下一次交易做准备
res += tmpMax;
buy = i;
tmpMax = 0;
}
}
return res;
}

考察点

  • 贪心