Rotate Array
Problem Statement
Given an array, rotate it to the right by k steps. Modify the array in-place.
Function Signature:
function rotate(arr, k) {
// Your code here
}
Examples
| Input | k | Output |
|---|---|---|
[1, 2, 3, 4, 5, 6, 7] | 3 | [5, 6, 7, 1, 2, 3, 4] |
[-1, -100, 3, 99] | 2 | [3, 99, -1, -100] |
[1, 2] | 3 | [2, 1] |
Constraints
- Array length: 1 ≤ arr.length ≤ 10,000
- Element values: -10⁹ ≤ arr[i] ≤ 10⁹
- k ≥ 0
Interactive Editor
function rotate(arr, k) { // Your code here }
Hints
Hint 1: Handle k > length
If k is larger than the array length, rotating by k is the same as rotating by k % arr.length. For example, rotating a 7-element array by 10 is the same as rotating by 3.
Hint 2: Multiple Approaches
There are several ways to solve this:
- Extra array: Copy elements to their final positions in a new array, then copy back. O(n) space.
- One by one: Rotate by 1, k times. O(n*k) time.
- Reversal algorithm: Reverse the whole array, then reverse each part. O(1) space.
The reversal approach is elegant and efficient.
Hint 3: The Reversal Pattern
To rotate [1, 2, 3, 4, 5, 6, 7] right by 3:
- Reverse the entire array:
[7, 6, 5, 4, 3, 2, 1] - Reverse the first k elements:
[5, 6, 7, 4, 3, 2, 1] - Reverse the remaining elements:
[5, 6, 7, 1, 2, 3, 4]
The magic: reversing "undoes" the first reversal for each segment, but with the segments swapped.
Hint 4: Why Does Reversal Work?
Think of rotation as moving the last k elements to the front. The reversal algorithm achieves this through a clever trick:
- The full reversal puts the last
kelements at the front, but in reverse order - Reversing just those
kelements fixes their internal order - Reversing the remaining
n-kelements fixes their internal order too
Each reversal is O(n), and we do three of them, so total is O(n) time with O(1) space.
Solution
View Solution Explanation
function rotate(arr, k) {
k = k % arr.length;
if (k === 0 || arr.length <= 1) return arr;
reverse(arr, 0, arr.length - 1); // Reverse all
reverse(arr, 0, k - 1); // Reverse first k
reverse(arr, k, arr.length - 1); // Reverse rest
return arr;
}
function reverse(arr, start, end) {
while (start < end) {
const temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
The Reversal Algorithm
This elegant approach uses three reversals to achieve the rotation:
Step 1: Reverse the entire array
[1, 2, 3, 4, 5, 6, 7] → [7, 6, 5, 4, 3, 2, 1]
Step 2: Reverse the first k elements
[7, 6, 5, 4, 3, 2, 1] → [5, 6, 7, 4, 3, 2, 1]
Step 3: Reverse the remaining n-k elements
[5, 6, 7, 4, 3, 2, 1] → [5, 6, 7, 1, 2, 3, 4]
Why This Works
Imagine the array as two parts: [A][B] where B is the last k elements.
- We want:
[B][A] - Reversing gives:
[B_rev][A_rev](both parts reversed, but in swapped positions) - Reversing each part individually fixes them:
[B][A]
Edge Cases
- k = 0 or k = n: No rotation needed
- k > n: Use
k % nto get effective rotation - n = 1: Single element, no change needed
Alternative Approaches
Extra Array (O(n) space):
function rotate(arr, k) {
const n = arr.length;
const result = new Array(n);
for (let i = 0; i < n; i++) {
result[(i + k) % n] = arr[i];
}
for (let i = 0; i < n; i++) {
arr[i] = result[i];
}
return arr;
}
Simpler to understand but uses extra space.
Complexity: O(n) time, O(1) space (for reversal approach).