n個の整数a1、a2、...、anのシーケンスがあります。シーケンス内のすべての要素を最小要素で変更する必要があります。最小要素はその前に配置されます。そのような要素がない場合は、-1に置き換える必要があります。すべての変更は、同時かつ独立しています。リスト操作アルゴリズムが遅すぎる
例:
4 3 1 2 1 - > -1 4 3 3 2
5 4 3 2 1 - > -1 5 4 3 2
マイコードが遅すぎるとシーケンスが大きすぎるとタイムアウトエラーのテストに合格しません。どのように性能を向上させることができますか?
public static void main(String[] args) throws InterruptedException {
ArrayList<Integer> list = new ArrayList<>();
Scanner scanner = new Scanner(System.in);
int nElements = scanner.nextInt();
for (int i = 0; i < nElements; i++) {
list.add(scanner.nextInt());
}
ArrayList<Integer> newList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
int tmp = -1;
for (int j = i - 1; j >= 0; j--) {
if (list.get(i) < list.get(j)) {
if (list.get(j) < tmp || tmp == -1) {
tmp = list.get(j);
}
}
}
newList.add(tmp);
}
list = newList;
}
UPDATE:
は、ここに私のコードである私は、新しい値は、我々は変更の要素よりも大きくなければならないことを言及するのを忘れてしまいました。
要件は正確には何ですか?私は例を得ていない。最終的なサイズについての良い見積もりを与えることによって 'ArrayList'をスピードアップできることに注意してください。そのコンストラクタで 'initialCapacity'と伝えます。 – Zabuza
'4 3 1 2 1 - > -1 4 3 1 1'ではないでしょうか? – janos
内部ループは必要ありません。要素iの前の最小要素は(要素i-1の前に最小)と(要素i-1)の最小値です。あなたは1回のパスでそれを行うことができます。 –