Minimize the maximum absolute difference of adjacent elements in a circular array

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++
// C++ Program to minimize the // maximum absolute difference // between adjacent elements // of the circular arrayÂ
#include <bits/stdc++.h>using namespace std;Â
#define ll long longÂ
// Function to print the reordered array// which minimizes the maximum absolute// difference of adjacent elementsvoid solve(vector<int>& arr, int N){    // Sort the given array    sort(arr.begin(), arr.end());    // Reorder the array    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;        }    }    // Print the new ordering    for (int i : arr)        cout << i << " ";}Â
Â
// Driver codeint main(){Â Â Â Â int N = 7;Â Â Â Â vector<int> arr = {1, 3, 10, 2, 0, 9, 6};Â Â Â Â solve(arr, N);Â Â Â Â Â Â Â Â Â return 0;}Â
// this code is contributed by divyanshu gupta |
Java
// Java program to minimize the // maximum absolute difference // between adjacent elements // of the circular arrayimport java.util.*;Â
class GFG{Â
// Function to print the reordered array// which minimizes the maximum absolute// difference of adjacent elementsstatic void solve(Vector<Integer> arr, int N){         // Sort the given array    Collections.sort(arr);         // Reorder the array    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;        }    }         // Print the new ordering    for(int i : arr)        System.out.print(i + " ");}Â
// Driver codepublic 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);}}Â
// This code is contributed by Amit Katiyar |
Python3
# Python3 Program to minimize the # maximum absolute difference # between adjacent elements # of the circular arrayÂ
# Function to print the reordered array# which minimizes the maximum absolute# difference of adjacent elementsdef solve(arr, N):         # Sort the given array    arr.sort(reverse = False)         # Reorder the array    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                 # Print the new ordering    for i in arr:        print(i, end = " ")Â
# Driver codeif __name__ == '__main__':Â Â Â Â Â Â Â Â Â N = 7Â Â Â Â Â Â Â Â Â arr = [ 1, 3, 10, 2, 0, 9, 6 ]Â Â Â Â solve(arr, N)Â
Â
# This code is contributed by Samarth |
C#
// C# program to minimize the // maximum absolute difference // between adjacent elements // of the circular arrayusing System;using System.Collections.Generic;class GFG{Â
// Function to print the // reordered array which // minimizes the maximum // absolute difference of // adjacent elementsstatic void solve(List<int> arr,                   int N){     // Sort the given array  arr.Sort();Â
  // Reorder the array  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;    }  }Â
  // Print the new ordering  foreach(int i in arr)    Console.Write(i + " ");}Â
// Driver codepublic 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);}}Â
// This code is contributed by Rajput-Ji |
Javascript
<script>Â
// JavaScript Program to minimize the// maximum absolute difference// between adjacent elements// of the circular arrayÂ
// Function to print the reordered array// which minimizes the maximum absolute// difference of adjacent elementsfunction solve(arr, N){         // Sort the given array    arr.sort((a,b)=>a-b)         // Reorder the array    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      }   }                 // Print the new ordering    for(let i of arr)        document.write(i," ")}Â
// Driver codelet N = 7Â Â Â Â Â let arr = [ 1, 3, 10, 2, 0, 9, 6 ]solve(arr, N)Â
// This code is contributed by shinjanpatraÂ
</script> |
0 2 6 10 9 3 1
Â
Time complexity: O(N2) where N is the size of the given array
Auxiliary space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



