Given an array arr of size n where every element is in the range [0, n-1], rearrange the array so that arr[i] becomes arr[arr[i]] for every index i, using only O(1) extra space.
We need to update each element to its new value, but if we overwrite elements directly, we lose information needed for future updates. The trick is to encode both the old and new values at each index using modular arithmetic, since all values are in [0, n-1].
classSolution {
public:void rearrange(vector<int>& arr) {
int n = arr.size();
for (int i =0; i < n; ++i) {
arr[i] += (arr[arr[i]] % n) * n;
}
for (int i =0; i < n; ++i) {
arr[i] /= n;
}
}
};
1
2
3
4
5
6
7
8
9
10
11
classSolution {
publicvoidrearrange(ArrayList<Integer> arr) {
int n = arr.size();
for (int i = 0; i < n; i++) {
arr.set(i, arr.get(i) + (arr.get(arr.get(i)) % n) * n);
}
for (int i = 0; i < n; i++) {
arr.set(i, arr.get(i) / n);
}
}
}
1
2
3
4
5
6
7
classSolution:
defrearrange(self, arr: list[int]) ->None:
n = len(arr)
for i in range(n):
arr[i] += (arr[arr[i]] % n) * n
for i in range(n):
arr[i] //= n