用于大小为 2 的组之间的最大差异的 C++ 程序
给定一个偶数个元素的数组,使用这些数组元素组成 2 个组,使得总和最大的组与总和最小的组之间的差最大。
注意:一个元素只能是一组的一部分,并且它必须是至少一组的一部分。
例子:
Input : arr[] = {1, 4, 9, 6}
Output : 10
Groups formed will be (1, 4) and (6, 9),
the difference between highest sum group
(6, 9) i.e 15 and lowest sum group (1, 4)
i.e 5 is 10.
Input : arr[] = {6, 7, 1, 11}
Output : 11
Groups formed will be (1, 6) and (7, 11),
the difference between highest sum group
(7, 11) i.e 18 and lowest sum group (1, 6)
i.e 7 is 11.
简单方法:我们可以通过制作所有可能的组合并检查总和最高的组与总和最低的组之间的每组组合差异来解决这个问题。总共将形成 n*(n-1)/2 个这样的组 (nC2)。
时间复杂度:O(n^3),因为生成组需要 O(n^2) 并检查每个组需要 n 次迭代,因此总体上需要 O(n^3) 时间。
有效方法:我们可以使用贪心方法。对整个数组进行排序,我们的结果是最后两个元素的总和减去前两个元素的总和。
C++
// CPP program to find minimum difference
// between groups of highest and lowest
// sums.
#include
#define ll long long int
using namespace std;
ll CalculateMax(ll arr[], int n)
{
// Sorting the whole array.
sort(arr, arr + n);
int min_sum = arr[0] + arr[1];
int max_sum = arr[n-1] + arr[n-2];
return abs(max_sum - min_sum);
}
// Driver code
int main()
{
ll arr[] = { 6, 7, 1, 11 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << CalculateMax(arr, n) << endl;
return 0;
}
输出:
11
时间复杂度: O (n * log n)
进一步优化:
我们可以在线性时间内找到最大两个和最小两个,而不是排序,并将时间复杂度降低到 O(n)。
有关更多详细信息,请参阅有关 2 组最大差异的完整文章!