Другой вариант - нарезать массив, перебирая его для нахождения наилучшей прибыли:
res = ary.each_with_index.with_object([]) do |(buy_val, i), res|
highest_val = ary[i..].max
highest_idx = ary[i..].each_with_index.max[1] + i
res << [highest_val - buy_val, i, highest_idx]
end.max_by(&:first)
#=> [12, 1, 4]
Где 12
- прибыль, 1
- индекс покупки, а 4
- индекс продаж.
Чтобы понять, как это работает, запустите эту расширенную версию, это стоит больше, чем любое письменное объяснение:
res = []
ary.each_with_index do |buy_val, i|
p buy_val
p ary[i..]
p highest_val = ary[i..].max
p highest_idx = ary[i..].each_with_index.max[1] + i
res << [highest_val - buy_val, i, highest_idx]
p '----'
end
res #=> [[0, 0, 0], [12, 1, 4], [9, 2, 4], [6, 3, 4], [0, 4, 4], [2, 5, 8], [4, 6, 8], [9, 7, 8], [0, 8, 8]]
Из стандартной библиотеки Ruby я использовал Enumerable # each_with_index , [118 ] Enumerable # each_with_object , Enumerable # max и Enumerable # max_by .
За получение индекса максимума, который я любезно украл у Чака ( https://stackoverflow.com/a/2149874 ), спасибо и +1. Я не искал лучшего варианта.
Согласно комментарию Кэри Свовеланд в связанном посте:
[..]
blockquote>a.index(a.max)
вернет индекс первого, аa.each_with_index.max[1]
вернет индекс последний [..]Итак, возможно, вы захотите использовать первый вариант, чтобы сократить время между покупкой и продажей.
Что случилось:
Определение "nonrecursivecountcells" не имеет никакого параметра, названного сеткой. Необходимо передать имя типа И имя переменной к функции. Вы только передали тип.
Отметьте, используете ли Вы сетку имени для параметра, то имя не имеет никакого отношения к Вашему основному () объявление сетки. Вы, возможно, использовали любое другое имя также.
***
Также Вы не можете передать массивы как значения.
Как зафиксировать:
Простой способ зафиксировать это состоит в том, чтобы передать указатель на массив к функции "nonrecursivecountcells".
int nonrecursivecountcells(color[ROW_SIZE][COL_SIZE], int, int);
лучше и безопасный с точки зрения типов->
int nonrecursivecountcells(color (&grid)[ROW_SIZE][COL_SIZE], int, int);
Об объеме:
Переменная, созданная на стеке, выходит из объема, когда блок, в котором это объявляется, завершается. Блок - что-либо в рамках открытия и соответствия закрывающей фигурной скобке. Например, если () {}, функция () {}, в то время как () {}...
Обратите внимание, что я сказал что переменная и не данные. Например, можно выделить память на "куче", и те данные все еще останутся допустимыми даже за пределами объема. Но переменная, которая первоначально указала на него, все еще выйдет из объема.
сетка не является глобальным, это локально для основной функции. Измените это:
int nonrecursivecountcells(color[ROW_SIZE][COL_SIZE], int row, int column)
к этому:
int nonrecursivecountcells(color grid[ROW_SIZE][COL_SIZE], int row, int column)
В основном Вы забыли давать тому первому параметрическому усилителю имя, сетка сделает, так как это соответствует Вашему коду.
Первый аргумент nonrecursivecountcells () не имеет имени переменной. Вы пытаетесь сослаться на него как на сетку в теле функции, таким образом, Вы, вероятно, хотите назвать это сеткой.
сетка не присутствует на объеме nonrecursivecountcells.
Или сделайте сетку глобальным массивом или передайте ее в качестве параметра функции.
исправьте объявление функции на
int nonrecursivecountcells(color grid[ROW_SIZE][COL_SIZE], int row, int column)
Поскольку в компиляторе говорится, grid
не был объявлен в пределах Вашей функции :) "Объем" в основном означает ряд фигурных скобок. Каждая переменная ограничена объемом, в котором она объявляется (к ней нельзя получить доступ вне того объема). В Вашем случае Вы объявляете grid
переменная в Вашем main()
функционируйте и пытающийся использовать его в nonrecursivecountcells()
. Вы, кажется, передаете его как аргумент colors
однако, таким образом, я предлагаю, чтобы Вы просто переименовали свое использование grid
в nonrecursivecountcells()
кому: colors
. Я думаю, что может быть что-то не так с попыткой передать массив тот путь также, таким образом, необходимо, вероятно, исследовать передачу его как указатель (если кто-то еще не говорит что-то об обратном).