Array Rotation Techniques in DSA Rust - Time & Space Complexity
When we rotate an array, we move its elements around. Understanding how long this takes helps us choose the best way to do it.
We want to know how the time needed grows as the array gets bigger.
Analyze the time complexity of the following code snippet.
fn rotate_array(arr: &mut [i32], k: usize) {
let n = arr.len();
let k = k % n;
arr.reverse();
arr[0..k].reverse();
arr[k..n].reverse();
}
This code rotates the array to the right by k steps using three reversals.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Reversing parts of the array by swapping elements.
- How many times: Each reversal touches elements once, total of n elements reversed in three parts.
As the array size grows, the number of swaps grows roughly the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 swaps |
| 100 | About 100 swaps |
| 1000 | About 1000 swaps |
Pattern observation: The work grows linearly with the size of the array.
Time Complexity: O(n)
This means the time to rotate grows directly with the number of elements in the array.
[X] Wrong: "Rotating by k steps takes k times longer than rotating by 1 step."
[OK] Correct: This method touches each element a fixed number of times regardless of k, so time depends on n, not k.
Knowing how array rotation works and its time cost helps you explain and choose efficient solutions in real coding tasks.
"What if we used a temporary array to store rotated elements? How would the time complexity change?"
Practice
[1, 2, 3, 4, 5]?Solution
Step 1: Understand left rotation by 2
Left rotation by 2 means removing the first two elements and placing them at the end.Step 2: Apply rotation on given array
Starting with [1, 2, 3, 4, 5], removing first two elements [1, 2] and appending them at the end gives [3, 4, 5, 1, 2].Final Answer:
[3, 4, 5, 1, 2] -> Option BQuick Check:
Left rotate by 2 = first 2 elements moved to end [OK]
- Confusing left rotation with right rotation
- Not moving elements but just swapping
- Thinking rotation reverses the array
arr of length 5 to the right by 1 position?Solution
Step 1: Understand right rotation by 1
Right rotation by 1 means last element moves to front, rest shift right.Step 2: Check code slices for correct order
let rotated = [&arr[4..5], &arr[0..4]].concat(); takes last element arr[4..5] and then first 4 elements arr[0..4], concatenating them correctly.Final Answer:
let rotated = [&arr[4..5], &arr[0..4]].concat(); -> Option CQuick Check:
Right rotate by 1 = last element + rest [OK]
- Using wrong slice indices
- Concatenating slices in wrong order
- Confusing left and right rotation slices
let arr = vec![10, 20, 30, 40, 50];
let k = 2;
let n = arr.len();
let rotated: Vec<_> = arr.iter().cycle().skip(n - k).take(n).cloned().collect();
println!("{:?}", rotated);Solution
Step 1: Understand rotation logic in code
Code cycles array, skips n-k=3 elements, then takes n=5 elements, effectively right rotating by 2.Step 2: Trace elements after skipping 3
Skipping first 3 elements: 10,20,30 skipped; next elements are 40,50, then cycle back 10,20,30.Step 3: Collect 5 elements
Elements collected: 40, 50, 10, 20, 30.Final Answer:
[40, 50, 10, 20, 30] -> Option DQuick Check:
Right rotate by 2 = last 2 elements front [OK]
- Confusing skip count with k
- Mixing left and right rotation logic
- Not using cycle iterator correctly
k positions. What is the bug?
fn left_rotate(arr: &mut [i32], k: usize) {
let n = arr.len();
for i in 0..k {
let temp = arr[i];
arr[i] = arr[n - k + i];
arr[n - k + i] = temp;
}
}Solution
Step 1: Analyze the swapping logic
The code swaps arr[i] with arr[n-k+i], which does not achieve left rotation but swaps wrong pairs.Step 2: Understand correct rotation method
Left rotation requires shifting elements left and moving first k elements to end, not swapping like this.Final Answer:
It swaps wrong elements; rotation logic is incorrect -> Option AQuick Check:
Incorrect swap logic = wrong rotation [OK]
- Swapping instead of shifting elements
- Using wrong indices for swapping
- Assuming swap equals rotation
arr = [1, 2, 3, 4, 5, 6], how can you rotate it left by 4 positions using Rust slice operations without extra space?Solution
Step 1: Understand rotation by reversal method
Left rotate by k means reverse first k elements, reverse remaining, then reverse whole array.Step 2: Apply to k=4, n=6
Reverse first 4 elements [1,2,3,4], reverse last 2 elements [5,6], then reverse entire array.Final Answer:
Reverse first 4 elements, reverse last 2 elements, reverse entire array -> Option AQuick Check:
Rotation by reversal = reverse k, reverse n-k, reverse all [OK]
- Reversing in wrong order
- Mixing k and n-k segments
- Using extra space instead of in-place reversal
Ready to prove it?
Pass the test and this pattern moves unknown
