给定一个大小为N且数字为k的整数数组。该数组由随机顺序的整数组成。任务是找出k个元素组与数组其余部分之间的最大差值。该数组将分为两部分。第一部分是取出的一组k元素,第二部分是数组的其余元素。我们必须选择k个元素,以使两组元素之和之间的差异最大。
如果k较小(<=数组大小的一半),则最小的k个元素的总和最少,其余Nk个元素的总和最大。因此,最大差为-(其余Nk个元素的总和)-(最小k个元素的总和)。
如果k较大(>数组大小的一半),则最大的k个元素的总和最大,其余Nk个元素的总和最小。因此,最大差为(最大kelement的总和)-(其余Nk元素的总和)。
输入值
Arr[] = { 2,5,6,1,3,2,1,4 }. k=3
输出-k元素组与数组其余部分之间的最大差-16
解释-这里的k较小,因此至少3个数字的总和最小。
最少3个数字-1,1,2和= 4
剩余Nk = 5个数字:2,3,4,5,6 sum = 20
最大差异:20-4 = 16
输入值
Arr[] = { 2,2,3,4,8,3,4,4,8,7 }. k=6
输出-k元素组与数组其余部分之间的最大差-25
说明-这里的k较大,因此最高的6个数字将具有最大的和。
最高6个数字-8,8,7,4,4,4,总和= 35
其余Nk = 4个数字-2,2,3,3 sum = 10
最大差异-35-10 =
声明一个以随机顺序包含的整数数组。(Arr [])
创建一个变量来存储数组的大小。(N)
函数maxKDiff(int Arr [],int n,int k)用于计算数组中元素的第一个索引与最后一个索引之间的最大差(maxD)。
计算整个数组的总和并存储在arrsum中。
首先是计算至少k个元素的总和。使用for循环(i = 0; i <k)
如果k较小,则最小的k个元素的总和最小-
在D1中存储abs((整个数组的总和)-(2 *至少k个元素的总和))。两次是因为数组和也具有这些元素。
k较大,则最大的k个元素的总和最高-
在D2中存储abs((整个数组的总和)-(2 *最高k个元素的总和))。两次是因为数组和也具有这些元素。
比较D1与D2并将最大值存储在maxD中。
返回maxD作为结果。
#include <stdio.h> #include <math.h> //查找数组最大组差的函数 int maxKDiff (int arr[], int n, int k){ //数组总和 int arrsum = 0; int i; for(i=0;i<n;i++) arrsum+=arr[i]; //最小k之和 int sumk=0; for(i=0;i<k;i++) sumk+=arr[i]; //K最小的差异 int D1 = abs(arrsum - 2*sumk); //最大k个元素的总和 sumk=0; int j=0; for(i=n-1;j<4;i--){ sumk+=arr[i]; j++; } //k最大的差异 int D2 = abs(arrsum - 2*sumk); int maxD=D1>=D2?D1:D2; //返回最大差值 return maxD; } //驱动程序 int main(){ int arr[] ={ 2,3,2,10,7,12,8}; int n = 7; int k = 3; sort(arr,n); // to sort array in ascending order printf("Maximum difference between the group of k-elements and rest of the array : %d" , maxKDiff(arr,n,k)); return 0; }
输出结果
如果我们运行上面的代码,它将生成以下输出-
Maximum difference between the group of k-elements and rest of the array : 30