对的绝对差的最小和最大和
给定一个 N 个整数数组,其中 N 是偶数,求 N/2 对的绝对差的最小和最大和,该对是通过将每个元素与另一个元素配对形成的。
例子:
Input: a[] = {10, -10, 20, -40}
Output: min_sum = 40, max_sum = 80
Explanation: Pairs selected for minimum sum
(-10, -40) and (10, 20)
min_sum = |-10 - -40| + |20 - 10| = 40
Pairs selected for maximum sum
(-10, 20) and (-40, 10)
max_sum = |-10 - 20| + |10 - -40| = 80
Input: a[] = {20, -10, -1, 30}
Output: min_sum = 19, max_sum = 61
Explanation: Pairs selected for minimum sum
(-1, -10) and (20, 30)
min_sum = |-1 - -10| + |20 - 30| = 19
Pairs selected for maximum sum
(-1, 30) and (-10, 20)
max_sum = |-1 - 30| + |-10 - 20| = 61
方法:
最常见的观察是,对于差异的最小和,我们需要最接近的元素作为一对,而对于最大的和,我们需要最远的元素作为一对。因此,我们可以简单地对给定的元素列表进行排序,最接近的对将是 a[i]、a[i+1],它们的绝对差和将为我们得出最小和。最远的将是 (a[0], a[n-1]) 和 (a[1], a[n-2]) 等等,它们的绝对差和将为我们得出最大和。
C++
// CPP program to find minimum and maximum
// sum of absolute differences of pairs
#include
using namespace std;
// function to calculate minimum sum
int calculate_min_sum(int a[], int n)
{
// sorts the array c++ stl
sort(a, a + n);
// initially min=0 and max=0
int min_sum = 0;
// traverse to find the minimum sum
for (int i = 1; i < n; i += 2) {
// the adjacent elements difference
// will always be smaller
min_sum += abs(a[i] - a[i - 1]);
}
return min_sum;
}
// function to calculate maximum sum
int calculate_max_sum(int a[], int n)
{
// sorts the array c++ stl
sort(a, a + n);
int max_sum = 0;
// traverse to find the maximum sum
for (int i = 0; i < n / 2; i++) {
// the farthest distant elements sum
// will always be maximum
max_sum += abs(a[n - 1 - i] - a[i]);
}
return max_sum;
}
// Driver program to test above function
int main()
{
int a[] = { 10, -10, 20, -40};
int n = sizeof(a) / sizeof(a[0]);
cout << "The minimum sum of pairs is "
<< calculate_min_sum(a, n) << endl;
cout << "The maximum sum of pairs is "
<< calculate_max_sum(a, n) << endl;
return 0;
}
Java
// Java program to find minimum and maximum
// sum of absolute differences of pairs
import java.util.Arrays;
class GFG
{
// function to calculate minimum sum
static int calculate_min_sum(int[] a, int n)
{
// sorts the array c++ stl
Arrays.sort(a);
// initially min=0 and max=0
int min_sum = 0;
// traverse to find the minimum sum
for (int i = 1; i < n; i += 2) {
// the adjacent elements difference
// will always be smaller
min_sum += Math.abs(a[i] - a[i - 1]);
}
return min_sum;
}
// function to calculate maximum sum
static int calculate_max_sum(int[] a, int n)
{
// sorts the array c++ stl
Arrays.sort(a);
int max_sum = 0;
// traverse to find the maximum sum
for (int i = 0; i < n / 2; i++) {
// the farthest distant elements sum
// will always be maximum
max_sum += Math.abs(a[n - 1 - i] - a[i]);
}
return max_sum;
}
// Driver program to test above function
public static void main (String[] args) {
int[] a = { 10, -10, 20, -40};
int n = a.length;
System.out.println("The minimum sum of pairs is " +
calculate_min_sum(a, n));
System.out.println("The maximum sum of pairs is " +
calculate_max_sum(a, n));
}
}
/* This code is contributed by Mr. Somesh Awasthi */
Python3
# Python 3 program to find minimum and maximum
# sum of absolute differences of pairs
# function to calculate minimum sum
def calculate_min_sum( a, n):
# sorts the array c++ stl
a.sort()
# initially min=0 and max=0
min_sum = 0
# traverse to find the minimum sum
for i in range(1, n, 2):
# the adjacent elements difference
# will always be smaller
min_sum += abs(a[i] - a[i - 1])
return min_sum
# function to calculate maximum sum
def calculate_max_sum(a, n):
# sorts the array c++ stl
a.sort()
max_sum = 0
# traverse to find the maximum sum
for i in range(n // 2):
# the farthest distant elements sum
max_sum += abs(a[n - 1 - i] - a[i])
return max_sum
# Driver Code
if __name__ == "__main__":
a = [ 10, -10, 20, -40]
n = len(a)
print("The minimum sum of pairs is",
calculate_min_sum(a, n))
print( "The maximum sum of pairs is",
calculate_max_sum(a, n))
# This code is contributed by ita_c
C#
// C# program to find minimum and maximum
// sum of absolute differences of pairs
using System;
class GFG
{
// function to calculate minimum sum
static int calculate_min_sum(int []a, int n)
{
// sorts the array c++ stl
Array.Sort(a);
// initially min=0 and max=0
int min_sum = 0;
// traverse to find the minimum sum
for (int i = 1; i < n; i += 2) {
// the adjacent elements difference
// will always be smaller
min_sum += Math.Abs(a[i] - a[i - 1]);
}
return min_sum;
}
// Function to calculate maximum sum
static int calculate_max_sum(int []a, int n)
{
// sorts the array c++ stl
Array.Sort(a);
int max_sum = 0;
// Traverse to find the maximum sum
for (int i = 0; i < n / 2; i++) {
// the farthest distant elements sum
// will always be maximum
max_sum += Math.Abs(a[n - 1 - i] - a[i]);
}
return max_sum;
}
// Driver Code
public static void Main ()
{
int []a = { 10, -10, 20, -40};
int n = a.Length;
Console.WriteLine("The minimum sum of pairs is " +
calculate_min_sum(a, n));
Console.Write("The maximum sum of pairs is " +
calculate_max_sum(a, n));
}
}
// This code is contributed by nitin mittal.
PHP
Javascript
输出:
The minimum sum of pairs is 40
The maximum sum of pairs is 80
时间复杂度: O(n log n)