给定N个整数的圆形数组arr ,任务是在不进行任何删除的情况下最小化数组相邻元素的最大绝对差。
例子:
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).
方法:
为了解决该问题,仅显示排序的数组将导致错误的解决方案,因为它被视为圆形数组。排序后,最后索引的元素和第一个索引的元素分别是数组中的最高元素和最低元素。因此,可以进一步最小化相邻元件之间的最大差异。因此,在排序之后,我们需要对排序后的数组重新排序,以使偶数索引元素位于数组的奇数索引元素之前,并以相反的顺序排列奇数索引元素。
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 cirular 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.
下面的代码是上述方法的实现:
C++
// C++ Program to minimize the
// maximum absolute difference
// between adjacent elements
// of the circular array
#include
using namespace std;
#define ll long long
// Function to print the reordered array
// which minimizes thee maximum absolute
// difference of adjacent elements
void solve(vector& 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 code
int main()
{
int N = 7;
vector 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 array
import java.util.*;
class GFG{
// Function to print the reordered array
// which minimizes thee maximum absolute
// difference of adjacent elements
static void solve(Vector 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 code
public static void main(String[] args)
{
int N = 7;
Vector 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 thee maximum absolute
# difference of adjacent elements
def 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 code
if __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 array
using System;
using System.Collections.Generic;
class GFG{
// Function to print the
// reordered array which
// minimizes thee maximum
// absolute difference of
// adjacent elements
static void solve(List 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 code
public static void Main(String[] args)
{
int N = 7;
List arr = new List();
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
0 2 6 10 9 3 1