Quickly find multiple left rotations of an array

Hello Everyone,

Given an array of size n and multiple values around which we need to left rotate the array. How to quickly find multiple left rotations?
Examples:

Input : arr[] = {1, 3, 5, 7, 9}
k1 = 1
k2 = 3
k3 = 4
k4 = 6
Output : 3 5 7 9 1
7 9 1 3 5
9 1 3 5 7
3 5 7 9 1

Input : arr[] = {1, 3, 5, 7, 9}
k1 = 14
Output : 9 1 3 5 7

Simple Approach: We have already discussed different approaches given in below posts.

  1. Left Rotation of array (Simple and Juggling Algorithms)
  2. Block swap algorithm for array rotation
  3. Reversal algorithm for array rotation

The best of above approaches take O(n) time and O(1) extra space.
Efficient Approach:
The above approaches work well when there is a single rotation required. The approaches also modify the original array. To handle multiple queries of array rotation, we use a temp array of size 2n and quickly handle rotations.
Step 1: Copy the entire array two times in temp[0…2n-1] array.
Step 2: Starting position of array after k rotations in temp[] will be k % n. We do k
Step 3: Print temp[] array from k % n to k % n + n.

  • C++

// CPP implementation of left rotation of

// an array K number of times

#include<bits/stdc++.h>

using namespace std;

// Fills temp[] with two copies of arr[]

void preprocess( int arr[], int n, int temp[])

{

// Store arr[] elements at i and i + n

for ( int i = 0; i<n; i++)

temp[i] = temp[i + n] = arr[i];

}

// Function to left rotate an array k times

void leftRotate( int arr[], int n, int k, int temp[])

{

// Starting position of array after k

// rotations in temp[] will be k % n

int start = k % n;

// Print array after k rotations

for ( int i = start; i < start + n; i++)

cout << temp[i] << " " ;

cout << endl;

}

// Driver program

int main()

{

int arr[] = {1, 3, 5, 7, 9};

int n = sizeof (arr) / sizeof (arr[0]);

int temp[2*n];

preprocess(arr, n, temp);

int k = 2;

leftRotate(arr, n, k, temp);

k = 3;

leftRotate(arr, n, k, temp);

k = 4;

leftRotate(arr, n, k, temp);

return 0;

}

Output:

5 7 9 1 3 7 9 1 3 5 9 1 3 5 7

Note that the task to find starting address of rotation takes O(1) time . It is printing the elements that take O(n) time.

Space optimized Approach: The above method takes extra space. Below given is a space-optimized solution.

// CPP implementation of left rotation of

// an array K number of times

#include<bits/stdc++.h>

using namespace std;

// Function to left rotate an array k times

void leftRotate( int arr[], int n, int k)

{

// Print array after k rotations

for ( int i = k; i < k + n; i++)

cout << arr[i%n] << " " ;

}

// Driver program

int main()

{

int arr[] = {1, 3, 5, 7, 9};

int n = sizeof (arr) / sizeof (arr[0]);

int k = 2;

leftRotate(arr, n, k);

cout << endl;

k = 3;

leftRotate(arr, n, k);

cout << endl;

k = 4;

leftRotate(arr, n, k);

cout << endl;

return 0;

}

Output:

5 7 9 1 3 7 9 1 3 5 9 1 3 5 7