解题思路

将价格变化转换为求收益最大化, 与求数组的最大子序和那道题类似

利用前一个数计算出本次相对收益, 且若之前的累计收益大于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.