Rotate Array — Triple Reverse O(n) O(1) [Microsoft, Amazon]

Sanjeev SharmaSanjeev Sharma
2 min read

Advertisement

Problem Statement

Rotate nums to the right by k steps in-place.

Input: [1,2,3,4,5,6,7], k=3[5,6,7,1,2,3,4]

Intuition — Three Reversal Trick

  1. Reverse the entire array
  2. Reverse the first k elements
  3. Reverse the remaining n-k elements
[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

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro