189. Rotate Array
At a Glance
- Topic: arrays-hashing
- Pattern: Reverse trick (triple reverse)
- Difficulty: Medium
- Companies: Amazon, Microsoft, Apple, Google, Meta
- Frequency: High
- LeetCode: 189
Problem (one-liner)
Given integer array numbers and non-negative steps, rotate the array to the right by steps positions in-place. Equivalently, each element moves steps steps forward with wrap-around.
Recognition Cues
- "Rotate array right by k"
kmay exceedn— reduce withk % n; in-placeO(1)extra → reverse method or cyclic swaps
Diagram
At-a-glance flow (replace with problem-specific Mermaid as you refine this note). camelCase node IDs; no spaces in IDs.
Loading diagram…
Approaches
- Brute force — slice concat extra array —
O(n)space. - Better — rotate one step
stepstimes —O(n · steps)worst. - Optimal — reverse all, reverse first
steps, reverse rest (after normalizingsteps) —O(n)time /O(1)space.
Optimal Solution
Go
package main
func rotate(numbers []int, steps int) {
length := len(numbers)
if length == 0 {
return
}
steps = steps % length
reverseRange(numbers, 0, length-1)
reverseRange(numbers, 0, steps-1)
reverseRange(numbers, steps, length-1)
}
func reverseRange(numbers []int, left int, right int) {
for left < right {
numbers[left], numbers[right] = numbers[right], numbers[left]
left++
right--
}
}JavaScript
function rotate(numbers, steps) {
const length = numbers.length;
if (length === 0) {
return;
}
const normalized = steps % length;
reverseRange(numbers, 0, length - 1);
reverseRange(numbers, 0, normalized - 1);
reverseRange(numbers, normalized, length - 1);
}
function reverseRange(numbers, left, right) {
let leftBound = left;
let rightBound = right;
while (leftBound < rightBound) {
[numbers[leftBound], numbers[rightBound]] = [numbers[rightBound], numbers[leftBound]];
leftBound++;
rightBound--;
}
}Walkthrough
numbers = [1,2,3,4,5,6,7], steps = 3 → [5,6,7,1,2,3,4]
| step | operation | array (conceptual) |
|---|---|---|
| 0 | start | 1 2 3 4 5 6 7 |
| 1 | reverse all | 7 6 5 4 3 2 1 |
| 2 | reverse first steps | 5 6 7 |
| 3 | reverse remainder | 5 6 7 1 2 3 4 |
Invariant: triple reverse equals rotating right by steps when steps normalized.
Edge Cases
steps % n == 0— array unchanged.n == 1— no-op.stepshuge — modulo first.
Pitfalls
- Off-by-one in reverse ranges after modulo.
- Using extra
O(n)array whenO(1)required.
Similar Problems
- 048. Rotate Image — matrix rotation transforms.
- 054. Spiral Matrix — index gymnastics on matrices.
- 088. Merge Sorted Array — in-place array moves.
Variants
- Left rotation — adjust reverse segment bounds.
- Rotate linked list — close cycle + break link.
Mind-Map Tags
#arrays #reverse #in-place #rotation #modular-index
Last updated on
Spotted something unclear or wrong on this page?