今日のインタビューでこの質問を受けましたが、その最適化されたソリューションは私を凍らせました (私は本当にこの会社で働きたかったので...)
それぞれが任意の期間の後の会社の株価を表す実数値の 1 つの配列が与えられた場合、最良の購入価格とそれに対応する最良の売却価格 (安く買って高く売る) を見つけます。
例を挙げて説明するために、Z 社の株式ティッカーを見てみましょう。
55.39 109.23 48.29 81.59 105.53 94.45 12.24
注意すべき重要な点は、配列が一時的に「ソート」されるという事実です。つまり、時間が経過すると、値が配列の右端に追加されます。したがって、買いの値は、売りの値の左側になります (ある必要があります)。
(上記の例では、理想的なソリューションは で購入し48.29て で販売することです105.53)
O(n 2 ) の複雑さ (Java で実装)で簡単に単純なソリューションを思いつきました。
// returns a 2-element array: first element is the index in the argument array
// of the best buying price, and the second element is the index of the best
// selling price which, collectively, maximize the trading return
//
// if there is no favorable trading (e.g. prices monotonically fall), null is returned
public int[] maximizeReturn(ArrayList<Double> prices) {
int [] retval = new int[2];
int BUY = 0, SELL = 1;
retval[BUY] = retval[SELL] = -1; // indices of buy and sell prices, respectively
for (int i = 0; i < prices.size(); i++) {
for (int j = i + 1; j < prices.size(); j++) {
double difference = prices.get(j).doubleValue() -
prices.get(i).doubleValue();
if (difference > 0.0) {
if (retval[BUY] < 0 || difference > prices.get(retval[SELL]).doubleValue() -
prices.get(retval[BUY]).doubleValue()) {
retval[BUY] = i;
retval[SELL] = j;
}
}
}
}
return (retval[BUY] > 0 ? retval : null);
}
ここで私は失敗しました:線形時間 O(n) solutionがあり、それを理解しようとして完全に爆撃しました (ええ、私は知っています、FAIL)。線形時間ソリューションを実装する方法を知っている人はいますか? (慣れ親しんだ言語で構いません)ありがとうございます!
編集
興味のある人のために言うと、今日、彼らが私にこの質問をした場所で面接した仕事に就けなかったという知らせを受け取った. :(