После arr[i] = arr[arr[i] - 1];
значение arr[i]
было изменено и arr[arr[i] - 1]
больше не указывает на одно и то же хранилище, arr[arr[i] - 1] = temp;
пишет в неправильное хранилище.
Таким образом, вы фактически не меняете два значения. Это может быть очевидно, если вы представляете его как арифметику указателя c.
int temp = *(arr + i);
*(arr + i) = *(arr + temp - 1);
*(arr + *(arr + i) - 1) = temp;
Последняя строка равна *(arr + *(arr + temp - 1) - 1)
со значениями, присутствующими в момент перед выполнением строки 2, что неверно по определению задачи.
На самом деле это дает очевидное решение:
int temp = *(arr + i);
*(arr + i) = *(arr + temp - 1);
*(arr + temp - 1) = temp;
или
int temp = arr[i];
arr[i] = arr[temp - 1];
arr[temp - 1] = temp;
Что дает результат 5, полученный от minimumSwaps
.
По существу вы истекло время, потому что первый вариант не может найти решение.