Это интересная проблема, потому что она кажется трудной, но тщательная мысль дает элегантное, исправленное решение.
Как уже отмечалось, его можно решить грубо -force в O (N ^ 2) времени. Для каждой записи в массиве (или списке), итерации по всем предыдущим записям, чтобы получить min или max в зависимости от того, найти ли проблему наибольший коэффициент усиления или потери.
Вот как думать о решении в O (N): каждая запись представляет собой новый возможный максимум (или мин). Затем все, что нам нужно сделать, это сохранить предыдущий мин (или максимум) и сравнить diff с током и предыдущим мин (или max). Легкий peasy.
Вот код, в Java как тест JUnit:
import org.junit.Test;
public class MaxDiffOverSeriesProblem {
@Test
public void test1() {
int[] testArr = new int[]{100, 80, 70, 65, 95, 120, 150, 75, 95, 100, 110, 120, 90, 80, 85, 90};
System.out.println("maxLoss: " + calculateMaxLossOverSeries(testArr) + ", maxGain: " + calculateMaxGainOverSeries(testArr));
}
private int calculateMaxLossOverSeries(int[] arr) {
int maxLoss = 0;
int idxMax = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] > arr[idxMax]) {
idxMax = i;
}
if (arr[idxMax] - arr[i] > maxLoss) {
maxLoss = arr[idxMax] - arr[i];
}
}
return maxLoss;
}
private int calculateMaxGainOverSeries(int[] arr) {
int maxGain = 0;
int idxMin = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] < arr[idxMin]) {
idxMin = i;
}
if (arr[i] - arr[idxMin] > maxGain) {
maxGain = arr[i] - arr[idxMin];
}
}
return maxGain;
}
}
В случае вычисления наибольшей потери мы отслеживаем максимальное количество в списке (цена покупки) до текущей записи. Затем мы вычисляем разницу между максимальным и текущим. Если max - current> maxLoss, то мы сохраняем этот diff как новый maxLoss. Так как индекс max гарантированно меньше индекса тока, мы гарантируем, что дата «buy» меньше даты «sell».
В случае вычисления наибольшего выигрыша все обращается вспять. Мы отслеживаем мин в списке до текущей записи. Мы вычисляем разность между минимумом и током (изменяем порядок в вычитании). Если current - min> maxGain, то мы сохраняем этот diff как новый maxGain. Опять же, индекс «buy» (min) приходит перед индексом текущего («продавать»).
Нам остается только отслеживать maxGain (или maxLoss), а индекс min или макс, но не оба, и нам не нужно сравнивать индексы, чтобы подтвердить, что «покупка» меньше, чем «продать», поскольку мы получаем это естественно.
Можно использовать исходную функцию индексации Средств отладки для Windows, который сохранит ссылки на соответствующие изменения файлов в исходном репозитории как альтернативный поток в файле PDB.
Если Вы обращаетесь, более универсальны о путях, встроенных в pdb файл, Вы могли сначала использовать команду MS-DOS subst
для отображения конкретной папки на букву диска.
subst N: <MyRealPath>
Тогда открывают Ваш проект относительно N: управляйте и восстановите его. Ваши файлы PDB сошлются на исходные файлы на N:. Теперь не имеет значения, куда Вы помещаете тот определенный набор исходных файлов, пока Вы впоследствии называете корневой каталог "N": как Вы сделал, когда Вы создали его.
Эта практика рекомендуется John Robbins в его превосходной книге, Приложения Отладки для Microsoft.NET и Microsoft Windows .
Это, конечно, возможно, как На Freund уже указал. Но если это только так, чтобы источники могли быть расположены и загружены во время отладки, затем лучший путь состоял бы в том, чтобы установить исходный путь соответственно. После того, как установленный в отладчике, это будет предварительное обучение иностранных военных стажеров в США все твердые кодированные пути в PDBs.
В windbg (например):
.srcpath + path_to_source_rootили это (в случае, если Вы отлаживаете удаленно):
.lsrcpath + path_to_source_root