static List<Answer> solve(int[] numbers) { int n = numbers.length; Element[] a = new Element[n]; for (int i = 0; i < n; i++) { a[i] = new Element(numbers[i], i); } int id = -1; for (int i = 0; i < n; i++) { if (luckies.contains(a[i].x)) { id = i; break; } } Element[] b = a.clone(); Arrays.sort(b); if (Arrays.equals(a, b)) { return new ArrayList<Answer>(); } if (id == -1) { return null; } boolean[] did = new boolean[n]; for (int i = 0; i < n; i++) { if (a[i] == b[i]) { did[i] = true; } } List<Answer> ans = new ArrayList<Answer>(); int cur = 0; while (cur < n) { while (b[id] != a[id]) { int newId = b[id].n; swap(id, b[id].n, ans, a); did[id] = true; id = newId; } while (cur < n && did[cur] || cur == id) { cur++; } if (cur < n) { int newId = cur; swap(cur, id, ans, a); id = newId; } } // for (int i = 1; i < n; i++) { // if (a[i].x < a[i - 1].x) { // throw new AssertionError(); // } // } // if (ans.size() > 2 * n) { // throw new AssertionError(); // } return ans; }