Если я правильно понимаю вашу проблему, вы ищете два индекса (i, j) в массиве с i этой связанной проблемы , которая просит вас найти индексы (i, j) с i ≤ j, такие что A [j] - A [я] как можно больше.Эта проблема имеет очень быстрый O (n) -время, O (1) -пространственный алгоритм, который также может быть адаптирован к этой проблеме.Интуиция состоит в том, чтобы решить проблему для массива, состоящего только из первого элемента вашего массива, затем для первых двух элементов, затем из первых трех и т. Д. Как только вы решили проблему для первых n элементов массива,у вас есть общее решение проблемы.
Давайте подумаем, как это сделать.Первоначально, когда вы рассматриваете только первый элемент массива, лучший процент увеличения, который вы можете получить, составляет 0%, если сравнивать элемент с самим собой.Теперь предположим (индуктивно), что вы решили проблему для первых k элементов массива и хотите посмотреть, что произойдет, если вы посмотрите на следующий элемент массива.Когда это происходит, выполняется одно из двух условий.Во-первых, максимальное процентное увеличение по первым k элементам также может быть максимальным процентным увеличением по первым (k + 1) элементам.Например, если (k + 1) -й элемент массива является чрезвычайно малым числом, то, скорее всего, вы не сможете получить значительный процентный рост от чего-то в первых k элементах до этого значения.Во-вторых, максимальное процентное увеличение может быть от одного из первых k элементов до (k + 1) -го элемента.Если это так, то наибольшее процентное увеличение будет от наименьшего из первых k элементов к (k + 1) -ому элементу.
Объединяя эти два случая, мы получаем, что наилучший процентный рост по сравнению спервые k + 1 элементов - это максимум
- Наибольший процент увеличения первых k элементов или
- Процент увеличения от наименьшего из первых k элементов к (k+ 1) первый элемент.
Вы можете реализовать это, перебирая элементы массива, отслеживая два значения - минимальное значение, которое вы видели до сих пор, и пару, которая максимизирует процентное увеличение.Например, для вашего исходного массива
1 2 3 10 1 20 40 60
алгоритм будет работать так:
1 2 3 10 1 20 40 60
min 1 1 1 1 1 1 1 1
best (1,1) (1, 2) (1, 3) (1, 10) (1, 10) (1, 20) (1, 40) (1, 60)
, и вы выведите (1, 60) как наибольший процент увеличения,В другом массиве, таком как этот:
3 1 4 2 5
, алгоритм будет выглядеть следующим образом: 3 1 4 2 5 min 3 1 1 1 1 best (3,3) (3,3) (1,4) (1,4) (1,5)
и вы получите (1, 5).
Весь этот алгоритм использует только O (1) пробел и работает вO (n) время, которое является чрезвычайно хорошим решением проблемы.
В качестве альтернативы, вы можете подумать о том, чтобы свести эту проблему непосредственно к проблеме максимальной прибыли от одной продажи, взяв логарифм всех значений вваш массив.В этом случае, если вы найдете пару значений, где log A [j] - log A [i] максимизировано, это эквивалентно (с использованием свойств логарифмов) нахождению пары значений, где log (A [j] / A[я]) максимизируется.Поскольку функция log монотонно увеличивается, это означает, что вы нашли пару значений, где A [j] / A [i] максимизируется, как и предполагалось.