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.
- Left Rotation of array (Simple and Juggling Algorithms)
- Block swap algorithm for array rotation
- 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