Esistono due modi per avere una soluzione al problema:
1. Invertire una matrice nello spazio.
Passaggio 1. Scambia gli elementi all'inizio e l'indice di fine.
Passaggio 2. Incrementa l'indice di inizio decrementa l'indice di fine.
Passaggio 3. Iterare i passaggi 1 e 2 fino all'indice iniziale <indice finale
Per questo, la complessità temporale sarà O (n) e la complessità spaziale sarà O (1)
Il codice di esempio per invertire un array nello spazio è come:
public static int[] reverseAnArrayInSpace(int[] array) {
int startIndex = 0;
int endIndex = array.length - 1;
while(startIndex < endIndex) {
int temp = array[endIndex];
array[endIndex] = array[startIndex];
array[startIndex] = temp;
startIndex++;
endIndex--;
}
return array;
}
2. Invertire un array utilizzando un array ausiliario.
Passaggio 1. Creare un nuovo array di dimensioni uguale all'array specificato.
Passaggio 2. Inserire elementi nel nuovo array a partire dall'indice iniziale, dall'array specificato a partire dall'indice finale.
Per questo, la complessità temporale sarà O (n) e la complessità spaziale sarà O (n)
Il codice di esempio per invertire un array con un array ausiliario è simile a:
public static int[] reverseAnArrayWithAuxiliaryArray(int[] array) {
int[] reversedArray = new int[array.length];
for(int index = 0; index < array.length; index++) {
reversedArray[index] = array[array.length - index -1];
}
return reversedArray;
}
Inoltre, possiamo usare l'API Collections di Java per farlo.
L'API Collections utilizza internamente lo stesso approccio inverso nello spazio.
Il codice di esempio per l'utilizzo dell'API Collections è simile a:
public static Integer[] reverseAnArrayWithCollections(Integer[] array) {
List<Integer> arrayList = Arrays.asList(array);
Collections.reverse(arrayList);
return arrayList.toArray(array);
}