Array Rotation Techniques in DSA C++ - Time & Space Complexity
We want to understand how the time needed to rotate an array changes as the array gets bigger.
Specifically, we ask: How many steps does it take to move elements around when rotating?
Analyze the time complexity of the following code snippet.
void rotateArray(int arr[], int n, int d) {
for (int i = 0; i < d; i++) {
int temp = arr[0];
for (int j = 0; j < n - 1; j++) {
arr[j] = arr[j + 1];
}
arr[n - 1] = temp;
}
}
This code rotates the array to the left by d positions by moving elements one by one.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The inner loop shifts elements one position left.
- How many times: The inner loop runs (n - 1) times for each of the d outer loop iterations.
As the array size (n) or rotation count (d) grows, the total steps increase roughly by multiplying n and d.
| Input Size (n) | Rotation Count (d) | Approx. Operations |
|---|---|---|
| 10 | 2 | About 18 steps (2 * 9) |
| 100 | 10 | About 990 steps (10 * 99) |
| 1000 | 100 | About 99,900 steps (100 * 999) |
Pattern observation: The steps grow roughly like the product of n and d, so doubling either doubles the work.
Time Complexity: O(n * d)
This means the time needed grows proportionally to the array size times the number of rotations.
[X] Wrong: "Rotating an array by d positions always takes O(n) time regardless of d."
[OK] Correct: Actually, this simple method moves elements one by one d times, so time depends on both n and d.
Understanding how different rotation methods affect time helps you choose efficient solutions and explain your reasoning clearly.
"What if we used the reversal algorithm for rotation instead? How would the time complexity change?"
Practice
Solution
Step 1: Understand left rotation by 1
Left rotation by 1 means the element at index 0 moves to the end.Step 2: Effect on other elements
All other elements shift one position to the left to fill the gap.Final Answer:
Moves the first element to the end and shifts all others one position left -> Option BQuick Check:
Left rotate by 1 = first element moves to end [OK]
- Confusing left rotation with right rotation
- Thinking rotation reverses the array
- Assuming rotation sorts the array
arr of size n to the right by 1 position in C++?Solution
Step 1: Understand std::rotate parameters
std::rotate takes three pointers: first, middle, last. It rotates the range [first, last) so that the element at middle becomes first.Step 2: Rotate right by 1 means last element moves to front
To rotate right by 1, middle should point to the last element (arr + n - 1).Final Answer:
std::rotate(arr, arr + n - 1, arr + n); -> Option CQuick Check:
Right rotate by 1 uses middle = last-1 [OK]
- Using middle = first + 1 for right rotation
- Swapping parameters order incorrectly
- Confusing rotate range boundaries
int arr[] = {10, 20, 30, 40, 50};
int n = 5;
int d = 2;
std::rotate(arr, arr + d, arr + n);
for(int i = 0; i < n; i++) std::cout << arr[i] << " ";Solution
Step 1: Understand std::rotate with d=2
std::rotate(arr, arr + 2, arr + 5) moves elements starting from index 2 to front.Step 2: Rearrange array after rotation
Elements from index 2 to 4: 30, 40, 50 come first, then elements from index 0 to 1: 10, 20.Final Answer:
30 40 50 10 20 -> Option AQuick Check:
Rotate left by 2 shifts first 2 elements to end [OK]
- Confusing left and right rotation
- Off-by-one errors in index calculation
- Printing array before rotation
arr of size n to the left by d positions. What is the error?void rotateLeft(int arr[], int n, int d) {
for(int i = 0; i < d; i++) {
int temp = arr[0];
for(int j = 0; j < n - 1; j++) {
arr[j] = arr[j+1];
}
arr[n - 1] = temp;
}
}Solution
Step 1: Analyze inner loop index usage
The inner loop runs j from 0 to n-1, but accesses arr[j+1]. When j = n-1, arr[j+1] = arr[n] is accessed.Step 2: Identify out-of-bounds access
Array indices go from 0 to n-1, so arr[n] is invalid and causes out-of-bounds error.Final Answer:
Accessing arr[n] causes out-of-bounds error -> Option DQuick Check:
Array index out of bounds at arr[n] [OK]
- Ignoring out-of-bounds access
- Misunderstanding loop ranges
- Incorrectly assigning temp value
arr = {1, 2, 3, 4, 5, 6, 7} and d = 3, which sequence of operations correctly rotates the array to the left by d positions using the reversal algorithm?Solution
Step 1: Understand reversal algorithm steps
To rotate left by d, first reverse the first d elements.Step 2: Reverse last n-d elements, then reverse whole array
Next reverse the last n-d elements, finally reverse the entire array to get the rotated result.Final Answer:
Reverse first d elements, reverse last n-d elements, then reverse whole array -> Option AQuick Check:
Reversal algorithm order = first d, last n-d, whole [OK]
- Reversing parts before whole array
- Mixing order of reversing segments
- Confusing left and right rotation steps
Ready to prove it?
Pass the test and this pattern moves unknown
