解题思路
将价格变化转换为求收益最大化, 与求数组的最大子序和那道题类似
利用前一个数计算出本次相对收益, 且若之前的累计收益大于0则将之前的累计收益计入本次收益中, 若小于0则取本次收益, 并比较出迄今为止的最大收益
代码
-spec max_profit(Prices :: [integer()]) -> integer().
max_profit(Prices = [H | T]) ->
do_max_profit(T, #{pre_price => H, pre_profit => 0, max_profit => 0, prices => Prices}).
do_max_profit([Price | T], Args = #{pre_profit := PreProfit, pre_price := PrePrice, max_profit := MaxProfit}) ->
Profit = Price - PrePrice,
NewProfit = case PreProfit > 0 of
true ->
Profit + PreProfit;
_ ->
Profit
end,
NewMaxProfit = max(MaxProfit, NewProfit),
do_max_profit(T, Args#{pre_profit := NewProfit, pre_price := Price, max_profit := NewMaxProfit});
do_max_profit(_, #{max_profit:= MaxProfit}) ->
MaxProfit.