私は1つの要素のインデックスを持つ、二つのリストを持っており、他には、株価があります。各インデックスのIは最小値と現在のインデックスと最も近いにおける株価よりも小さい方在庫アレイ内の上方または下方に最寄りの株価を見つけなければなりません。ここに私のコードです。それは正確ですが、遅すぎるので、与えている時間制限の実行エラーを。
public static List<Integer> predictAnswer(List<Integer> stockData, List<Integer> queries) {
List<Integer> resQuery = new ArrayList<>();
/* to show -1 if there is no such stock price */
for (int i = 0; i < queries.size(); i++) {
resQuery.add(-1);
}
for (int i = 0; i < queries.size(); i++) {
/* the query index starts from 1 or supposes the first index is 1 */
int index = (int) (queries.get(i) - 1);
int value = stockData.get(index).intValue();
int j = index + 1;
int k = index - 1;
while (j < stockData.size() - 1 || k > 1) {
if (k < 1) {
if (stockData.get(j).intValue() < value) {
resQuery.set(i, j + 1);
break;
}
}
else if (j > stockData.size() - 1) {
if (stockData.get(k).intValue() < value) {
resQuery.set(i, k + 1);
break;
}
}
else if (stockData.get(k).intValue() < value) {
resQuery.set(i, k + 1);
break;
}
else if (stockData.get(j).intValue() < value) {
resQuery.set(i, j + 1);
break;
}
j++;
k--;
}
}
}
あなたは、パフォーマンスを改善するために、このコードをリファクタリングするために私を助けることができますか?
あなたのアルゴリズムが持っているようだO(n^2)
時の複雑さを。このような問題を解決するには、2つの古典的な方法がありますO(n)
。スタックおよびダイナミックプログラミングを用いて第2のいずれかを使用して、最初のもの。
私はあなたのアルゴリズムでは良くないかを説明する例を示唆しています。
あなたが持っていると仮定[1, 4, 3, 2]
株価として。
第三の要素について3
は、繰り返し処理であろう4
と、次に1
最も近い小さい下方を見つけること。
最後の要素については2
、それが反復処理するような3
、4
その後、1
最寄りの小さな下向きを見つけること。それは考慮にあなたがして前に行った作業を負いませんので 3
(それはあなたが反復処理する必要がないという事実は無視され4
、それがより大きいので、3
より大きなそうに2
)。あなたは多くの連続を持っている場合4
、それはむしろに直接ジャンプするよりも、それらのすべてを反復処理します1
。
動的なプログラミングでアルゴリズムの目的は、アカウントにあなたが前に行っている仕事を取ることです。これは、保存するために、配列を使用して、インデックスの各株価のために最も近い小さな下向きのを。上記の例では、このアレイの最終版をする[-1, 0, 0, 0]
(1
我々は-1を表すように、最も近い小さい下方を有していない、他の人より小さく最も近いは1
インデックス0です)。
この配列を計算するには、次の方法でそれを初期化します[-1, -1, -1, -1]
。最後の要素を処理する場合たとえば、あなたが持っています[-1, 0, 0, -1]
。あなたはそれを比較する3
と、それは見つける3
あなたが小さいの最寄りに直接ジャンプして大きい3
指標です0
。あなたは、インデックスの要素にあなたの要素を比較する0
(です1
)。1
あなたは最寄りの小さなを見つけるように小さいです...
そして、あなたは最寄りの小さい上向きのために同じことを行うことができます。