Rearrange an array in maximum minimum form | Set 2 (O(1) extra space)
Given a sorted array of positive integers, rearrange the array alternately i.e first element should be the maximum value, second minimum value, third-second max, fourth-second min and so on.
Examples:
Input: arr[] = {1, 2, 3, 4, 5, 6, 7}
Output: arr[] = {7, 1, 6, 2, 5, 3, 4}
Input: arr[] = {1, 2, 3, 4, 5, 6}
Output: arr[] = {6, 1, 5, 2, 4, 3}
We have discussed a solution in below post:
Rearrange an array in maximum minimum form | Set 1 : The solution discussed here requires extra space, how to solve this problem with O(1) extra space.
In this post a solution that requires O(n) time and O(1) extra space is discussed. The idea is to use multiplication and modular trick to store two elements at an index.
even index : remaining maximum element.
odd index : remaining minimum element.
max_index : Index of remaining maximum element
(Moves from right to left)
min_index : Index of remaining minimum element
(Moves from left to right)
Initialize: max_index = 'n-1'
min_index = 0
max_element = arr[max_index] + 1 //can be any element which is more than the maximum value in array
For i = 0 to n-1
If 'i' is even
arr[i] += arr[max_index] % max_element * max_element
max_index--
ELSE // if 'i' is odd
arr[i] += arr[min_index] % max_element * max_element
min_index++
How does expression “arr[i] += arr[max_index] % max_element * max_element” work ?
The purpose of this expression is to store two elements at index arr[i]. arr[max_index] is stored as multiplier and “arr[i]” is stored as remainder. For example in {1 2 3 4 5 6 7 8 9}, max_element is 10 and we store 91 at index 0. With 91, we can get original element as 91%10 and new element as 91/10.
Below implementation of the above idea:
C++
#include <bits/stdc++.h>
using namespace std;
void rearrange( int arr[], int n)
{
int max_idx = n - 1, min_idx = 0;
int max_elem = arr[n - 1] + 1;
for ( int i = 0; i < n; i++) {
if (i % 2 == 0) {
arr[i] += (arr[max_idx] % max_elem) * max_elem;
max_idx--;
}
else {
arr[i] += (arr[min_idx] % max_elem) * max_elem;
min_idx++;
}
}
for ( int i = 0; i < n; i++)
arr[i] = arr[i] / max_elem;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << "Original Arrayn" ;
for ( int i = 0; i < n; i++)
cout << arr[i] << " " ;
rearrange(arr, n);
cout << "\nModified Array\n" ;
for ( int i = 0; i < n; i++)
cout << arr[i] << " " ;
return 0;
}
|
Java
public class Main {
public static void rearrange( int arr[], int n)
{
int max_idx = n - 1 , min_idx = 0 ;
int max_elem = arr[n - 1 ] + 1 ;
for ( int i = 0 ; i < n; i++) {
if (i % 2 == 0 ) {
arr[i] += (arr[max_idx] % max_elem) * max_elem;
max_idx--;
}
else {
arr[i] += (arr[min_idx] % max_elem) * max_elem;
min_idx++;
}
}
for ( int i = 0 ; i < n; i++)
arr[i] = arr[i] / max_elem;
}
public static void main(String args[])
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 };
int n = arr.length;
System.out.println( "Original Array" );
for ( int i = 0 ; i < n; i++)
System.out.print(arr[i] + " " );
rearrange(arr, n);
System.out.print( "\nModified Array\n" );
for ( int i = 0 ; i < n; i++)
System.out.print(arr[i] + " " );
}
}
|
Python3
def rearrange(arr, n):
max_idx = n - 1
min_idx = 0
max_elem = arr[n - 1 ] + 1
for i in range ( 0 , n) :
if i % 2 = = 0 :
arr[i] + = (arr[max_idx] % max_elem ) * max_elem
max_idx - = 1
else :
arr[i] + = (arr[min_idx] % max_elem ) * max_elem
min_idx + = 1
for i in range ( 0 , n) :
arr[i] = arr[i] / max_elem
arr = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
n = len (arr)
print ( "Original Array" )
for i in range ( 0 , n):
print (arr[i], end = " " )
rearrange(arr, n)
print ( "\nModified Array" )
for i in range ( 0 , n):
print ( int (arr[i]), end = " " )
|
C#
using System;
class main {
public static void rearrange( int [] arr, int n)
{
int max_idx = n - 1, min_idx = 0;
int max_elem = arr[n - 1] + 1;
for ( int i = 0; i < n; i++) {
if (i % 2 == 0) {
arr[i] += (arr[max_idx] % max_elem) * max_elem;
max_idx--;
}
else {
arr[i] += (arr[min_idx] % max_elem) * max_elem;
min_idx++;
}
}
for ( int i = 0; i < n; i++)
arr[i] = arr[i] / max_elem;
}
public static void Main()
{
int [] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int n = arr.Length;
Console.WriteLine( "Original Array" );
for ( int i = 0; i < n; i++)
Console.Write(arr[i] + " " );
Console.WriteLine();
rearrange(arr, n);
Console.WriteLine( "Modified Array" );
for ( int i = 0; i < n; i++)
Console.Write(arr[i] + " " );
}
}
|
Javascript
<script>
function rearrange(arr, n)
{
let max_idx = n - 1, min_idx = 0;
let max_elem = arr[n - 1] + 1;
for (let i = 0; i < n; i++) {
if (i % 2 == 0) {
arr[i] += (arr[max_idx] % max_elem) * max_elem;
max_idx--;
}
else {
arr[i] += (arr[min_idx] % max_elem) * max_elem;
min_idx++;
}
}
for (let i = 0; i < n; i++)
arr[i] = Math.floor(arr[i] / max_elem);
}
let arr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ];
let n = arr.length;
document.write( "Original Array<br>" );
for (let i = 0; i < n; i++)
document.write(arr[i] + " " );
rearrange(arr, n);
document.write( "<br>Modified Array<br>" );
for (let i = 0; i < n; i++)
document.write(arr[i] + " " );
</script>
|
PHP
<?php
function rearrange(& $arr , $n )
{
$max_idx = $n - 1; $min_idx = 0;
$max_elem = $arr [ $n - 1] + 1;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $i % 2 == 0)
{
$arr [ $i ] += ( $arr [ $max_idx ] %
$max_elem ) * $max_elem ;
$max_idx --;
}
else
{
$arr [ $i ] += ( $arr [ $min_idx ] %
$max_elem ) * $max_elem ;
$min_idx ++;
}
}
for ( $i = 0; $i < $n ; $i ++)
$arr [ $i ] = (int)( $arr [ $i ] / $max_elem );
}
$arr = array (1, 2, 3, 4, 5, 6, 7, 8, 9);
$n = sizeof( $arr );
echo "Original Array" . "\n" ;
for ( $i = 0; $i < $n ; $i ++)
echo $arr [ $i ] . " " ;
rearrange( $arr , $n );
echo "\nModified Array\n" ;
for ( $i = 0; $i < $n ; $i ++)
echo $arr [ $i ] . " " ;
|
Output
Original Arrayn1 2 3 4 5 6 7 8 9
Modified Array
9 1 8 2 7 3 6 4 5
Time Complexity: O(n)
Auxiliary Space: O(1), as no extra space is used
Thanks Saurabh Srivastava and Gaurav Ahirwar for suggesting this approach.
Another Approach:
C++
#include <iostream>
using namespace std;
int main()
{
int a[] = { 11, 12, 13, 14, 15, 16 };
int n = sizeof (a) / sizeof (a[0]);
int last[n];
int min = 0, max = n - 1;
int count = 0;
for ( int i = 0; min <= max; i++) {
if (count % 2 == 0) {
last[i] = a[max];
max--;
}
else {
last[i] = a[min];
min++;
}
count++;
}
for ( int i = 0; i < n; i++)
cout << last[i] << " " ;
return 0;
}
|
Java
import java.util.Arrays;
public class Main {
public static void main(String[] args)
{
int [] a = { 11 , 12 , 13 , 14 , 15 , 16 };
int n = a.length;
int [] last = new int [n];
int min_val = 0 ;
int max_val = n - 1 ;
int count = 0 ;
for ( int i = 0 ; i < n; i++) {
if (count % 2 == 0 ) {
last[i] = a[max_val];
max_val -= 1 ;
}
else {
last[i] = a[min_val];
min_val += 1 ;
}
count += 1 ;
}
System.out.println(Arrays.toString(last));
}
}
|
Python3
a = [ 11 , 12 , 13 , 14 , 15 , 16 ]
n = len (a)
last = [ 0 ] * n
min_val = 0
max_val = n - 1
count = 0
for i in range (n):
if count % 2 = = 0 :
last[i] = a[max_val]
max_val - = 1
else :
last[i] = a[min_val]
min_val + = 1
count + = 1
for i in range (n):
print (last[i], end = ' ' )
|
C#
using System;
class GFG
{
static public void Main ()
{
int [] a = { 11, 12, 13, 14, 15, 16 };
int n = a.Length;
int [] last = new int [n];
int min = 0, max = n - 1;
int count = 0;
for ( int i = 0; min <= max; i++) {
if (count % 2 == 0) {
last[i] = a[max];
max--;
}
else {
last[i] = a[min];
min++;
}
count++;
}
for ( int i = 0; i < n; i++)
Console.Write(last[i] + " " );
}
}
|
Javascript
let a = [11, 12, 13, 14, 15, 16];
let n = a.length;
let last = new Array(n).fill(0);
let min_val = 0;
let max_val = n - 1;
let count = 0;
for (let i = 0; i < n; i++) {
if (count % 2 == 0) {
last[i] = a[max_val];
max_val--;
}
else {
last[i] = a[min_val];
min_val++;
}
count++;
}
console.log(last.join( ' ' ));
|
Time Complexity: O(n), where n is the size of the array
Auxiliary Space: O(n)
Thanks Apollo Doley for suggesting this approach.
Last Updated :
31 Jul, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...