Rotate Array — Triple Reverse O(n) O(1) [Microsoft, Amazon]
Advertisement
Problem Statement
Rotate
numsto the right byksteps in-place.
Input: [1,2,3,4,5,6,7], k=3 → [5,6,7,1,2,3,4]
- Intuition — Three Reversal Trick
- C++ Solution
- Java Solution
- Python Solution
- JavaScript Solution
- Complexity: O(n) time, O(1) space
Intuition — Three Reversal Trick
- Reverse the entire array
- Reverse the first
kelements - Reverse the remaining
n-kelements
[1,2,3,4,5,6,7] → reverse all → [7,6,5,4,3,2,1]
→ reverse [0..k-1] → [5,6,7,4,3,2,1]
→ reverse [k..n-1] → [5,6,7,1,2,3,4] ✓
C++ Solution
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k %= n;
auto rev = [&](int l, int r) { while(l<r) swap(nums[l++],nums[r--]); };
rev(0, n-1); rev(0, k-1); rev(k, n-1);
}
};
Java Solution
class Solution {
public void rotate(int[] nums, int k) {
int n = nums.length; k %= n;
reverse(nums,0,n-1); reverse(nums,0,k-1); reverse(nums,k,n-1);
}
void reverse(int[] a, int l, int r) {
while(l<r){int t=a[l];a[l++]=a[r];a[r--]=t;}
}
}
Python Solution
def rotate(nums, k):
n = len(nums); k %= n
nums.reverse()
nums[:k] = nums[:k][::-1]
nums[k:] = nums[k:][::-1]
JavaScript Solution
function rotate(nums, k) {
const n = nums.length; k %= n;
const rev = (l,r) => { while(l<r)[nums[l++],nums[r--]]=[nums[r],nums[l]]; };
rev(0,n-1); rev(0,k-1); rev(k,n-1);
}
Complexity: O(n) time, O(1) space
Advertisement