Il existe une suite de n entiers a1, a2, ..., an. Nous devons changer chaque élément de la séquence avec un élément minimal, qui est placé devant lui. S'il n'y a pas un tel élément, nous devons le remplacer par -1. Tous les changements sont simultanés et indépendants.L'algorithme de manipulation de liste est trop lent
exemples:
4 3 1 2 1 -> -1 4 3 3 2
5 4 3 2 1 -> -1 5 4 3 2
Mon code est trop lent et ne passe pas les tests avec des erreurs de temporisation lorsque la séquence est trop grande. Comment puis-je améliorer ses performances?
Voici mon code:
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;
}
MISE À JOUR: J'ai oublié de mentionner que la nouvelle valeur doit être supérieure à l'élément que nous changeons.
Quelle est exactement la condition? Je ne comprends pas les exemples. Notez que vous pouvez accélérer 'ArrayList' en donnant une bonne estimation de la taille finale. Vous dites cela dans son constructeur comme 'initialCapacity'. – Zabuza
Ce ne devrait pas être '4 3 1 2 1 -> -1 4 3 1 1'? – janos
Vous ne devriez pas avoir besoin de la boucle interne. L'élément minimal avant l'élément i est le minimum de (minimum avant l'élément i-1) et (élément i-1). Vous pouvez le faire en un seul passage. –