Minimize the maximum absolute difference of adjacent elements in a circular array
Last Updated :
12 Oct, 2022
Given a circular array arr of N integers, the task is to minimize the maximum absolute difference of adjacent elements of the array without any removals.
Examples:
Input: arr[] = {1, 3, 10, 2, 0, 9, 6}
Output: {0, 2, 6, 10, 9, 3, 1}
Explanation: In the above example, the maximum difference between adjacent elements is 6, which is between 9 and 3. Other orderings won’t be able to further minimize it.
Input: arr[] = {1, 2, 3, 4, 5, 6}
Output: {1, 3, 5, 6, 4, 2}
Example: The maximum difference is 2 between (1, 3) and (3, 5) and (6, 4) and (4, 2).
Approach:
In order to solve the problem, just displaying the sorted array would lead to an incorrect solution as it is treated as a circular array. After sorting, the last and first indexed elements are the highest and lowest elements in the array respectively. Thus, the maximum difference between adjacent elements can be further minimized. So, after sorting, we need to reorder the sorted array such that the even indexed elements precede the odd indexed elements of the array and arrange the odd indexed elements in reverse order.
Illustration: For the given array arr[] = {1, 3, 10, 2, 0, 9, 6}, the sorted array will be {0, 1, 2, 3, 6, 9, 10}. The maximum difference between adjacent elements in the circular array is |10 – 0| = 10. After reordering the array based on the above approach, we get the array to be {0, 2, 6, 10, 9, 3, 1}. Thus, the maximum difference is now minimized to |9 – 3| = 6.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define ll long long
void solve(vector< int >& arr, int N)
{
sort(arr.begin(), arr.end());
int fl = 1,k=0;
for ( int i=0;i<=N/2;i++)
{
if ((i%2 && fl) || !fl)
{
int x = arr[i];
arr.erase(arr.begin() + i);
arr.insert(arr.begin() + N - 1 - k, x);
k++;
fl = 0;
}
}
for ( int i : arr)
cout << i << " " ;
}
int main()
{
int N = 7;
vector< int > arr = {1, 3, 10, 2, 0, 9, 6};
solve(arr, N);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void solve(Vector<Integer> arr, int N)
{
Collections.sort(arr);
int fl = 1 , k = 0 ;
for ( int i = 0 ; i <= N / 2 ; i++)
{
if ((i % 2 != 0 && fl != 0 ) || fl == 0 )
{
int x = arr.get(i);
arr.remove(i);
arr.add( N - 1 - k, x);
k++;
fl = 0 ;
}
}
for ( int i : arr)
System.out.print(i + " " );
}
public static void main(String[] args)
{
int N = 7 ;
Vector<Integer> arr = new Vector<>();
arr.add( 1 );
arr.add( 3 );
arr.add( 10 );
arr.add( 2 );
arr.add( 0 );
arr.add( 9 );
arr.add( 6 );
solve(arr, N);
}
}
|
Python3
def solve(arr, N):
arr.sort(reverse = False )
fl = 1
k = 0
for i in range (N / / 2 + 1 ):
if ((i % 2 and fl) or fl = = 0 ):
x = arr[i]
arr.remove(arr[i])
arr.insert(N - 1 - k, x)
k + = 1
fl = 0
for i in arr:
print (i, end = " " )
if __name__ = = '__main__' :
N = 7
arr = [ 1 , 3 , 10 , 2 , 0 , 9 , 6 ]
solve(arr, N)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static void solve(List< int > arr,
int N)
{
arr.Sort();
int fl = 1, k = 0;
for ( int i = 0; i <= N / 2; i++)
{
if ((i % 2 != 0 &&
fl != 0) || fl == 0)
{
int x = arr[i];
arr.RemoveAt(i);
arr.Insert(N - 1 - k, x);
k++;
fl = 0;
}
}
foreach ( int i in arr)
Console.Write(i + " " );
}
public static void Main(String[] args)
{
int N = 7;
List< int > arr = new List< int >();
arr.Add(1);
arr.Add(3);
arr.Add(10);
arr.Add(2);
arr.Add(0);
arr.Add(9);
arr.Add(6);
solve(arr, N);
}
}
|
Javascript
<script>
function solve(arr, N){
arr.sort((a,b)=>a-b)
let fl = 1
let k=0
for (let i=0;i<(Math.log(N / 2) + 1);i++){
if ((i % 2 && fl) || fl == 0){
let x = arr[i]
arr = arr.filter((y)=>y != x)
arr.splice(N - 1 - k,0,x)
k += 1
fl = 0
}
}
for (let i of arr)
document.write(i, " " )
}
let N = 7
let arr = [ 1, 3, 10, 2, 0, 9, 6 ]
solve(arr, N)
</script>
|
Time complexity: O(N2) where N is the size of the given array
Auxiliary space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...