Ниже приведены ежедневные цены:
prices = [17, 3, 6, 9, 15, 8, 6, 1, 10]
Цена 17
в день 0
, 3
в день 1
и т. Д. Я предполагаю, что акция может быть куплена и продана в один и тот же день.
Первый шаг - определить для каждого возможного дня «покупки» i
, 0 <= i <= prices.size-1
день «продажи» j
,i <= j <= prices.size-1
, для которого цена самая высокая, и сохраните информацию, необходимую для массива хешей, по одному хешу на каждый возможный день «покупки»:
returns = prices.each_index.map do |i|
j = (i..prices.size-1).max_by { |j| prices[j] }
{ buy_day: i, sell_day: j, return: prices[j]-prices[i] }
end
#=> [{:buy_day=>0, :sell_day=>0, :return=>0},
# {:buy_day=>1, :sell_day=>4, :return=>12},
# {:buy_day=>2, :sell_day=>4, :return=>9},
# {:buy_day=>3, :sell_day=>4, :return=>6},
# {:buy_day=>4, :sell_day=>4, :return=>0},
# {:buy_day=>5, :sell_day=>8, :return=>2},
# {:buy_day=>6, :sell_day=>8, :return=>4},
# {:buy_day=>7, :sell_day=>8, :return=>9},
# {:buy_day=>8, :sell_day=>8, :return=>0}]
Это говорит нам о том, что если мы покупаем в день 0
(на 17
), мы должны сразу продать, что приведет к нулевой чистой прибыли. Если мы покупаем в день 1
(на 3
), мы должны продавать в день 4
(на 15
), получая чистый доход 15 - 3 = 12
. Если мы покупаем в день 7
, мы должны продавать в день 8
, получая возврат 9
.
Осталось определить максимальное значение return
:
h = returns.max_by { |h| h[:return] }
#=> {:buy_day=>1, :sell_day=>4, :return=>12}
Это предоставляет всю необходимую нам информацию: купить в день h[:buy_day] #=> 1
, продать в день h[:sell_day] #=> 4
и получить доход в размере h[:return] #=> 12
.
См. Array # each_index и перечислимых # max_by .