C語言中k個元素組與陣列其餘部分的最大差值
給定一個大小為N的整數陣列和一個數字k。該陣列包含隨機順序的整數。任務是找到k個元素組與陣列其餘部分之間的最大差值。陣列將被分成兩部分。第一部分是從中取出的一組k個元素,第二部分是陣列的其餘元素。我們必須選擇k個元素,使得兩組元素的和之間的差值最大。
如果k較小(<=陣列大小的一半),則最小的k個元素的和最小,其餘N-k個元素的和最大。因此,最大差值為−(其餘N-k個元素的和) - (最小的k個元素的和)。
如果k較大(>陣列大小的一半),則最大的k個元素的和最大,其餘N-k個元素的和最小。因此,最大差值為(最大的k個元素的和) - (其餘N-k個元素的和)。
輸入
Arr[] = { 2,5,6,1,3,2,1,4 }. k=3
輸出 - k個元素組與陣列其餘部分之間的最大差值 - 16
解釋 - 這裡k較小,所以最小的3個數的和最小。
最小的3個數 - 1,1,2 和為4
其餘N-k = 5個數: 2,3,4,5,6 和為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
其餘N-k = 4個數 - 2,2,3,3 和為10
最大差值 - 35-10=
下面程式中使用的方案如下
宣告一個包含隨機順序整數的陣列。( Arr[] )
建立一個變數來儲存陣列的大小。(N)
函式maxKDiff( int Arr[],int n, int k)用於計算陣列中元素的第一個和最後一個索引之間的最大差值(maxD)。
計算整個陣列的和並存儲在arrsum中。
首先計算最小的k個元素的和。使用for迴圈 ( i=0;i<k)
如果k較小,則最小的k個元素的和最小 -
在D1中儲存abs((整個陣列的和) - (最小的k個元素的和的兩倍))。兩倍是因為陣列和也包含這些元素。
k較大,則最大的k個元素的和最大 -
在D2中儲存abs((整個陣列的和) - (最大的k個元素的和的兩倍))。兩倍是因為陣列和也包含這些元素。
比較D1與D2,並將最大值儲存在maxD中。
返回maxD作為結果。
示例
#include <stdio.h> #include <math.h> // function for finding maximum group difference of array int maxKDiff (int arr[], int n, int k){ // sum of array int arrsum = 0; int i; for(i=0;i<n;i++) arrsum+=arr[i]; //sum of smallest k int sumk=0; for(i=0;i<k;i++) sumk+=arr[i]; // difference for k-smallest int D1 = abs(arrsum - 2*sumk); //sum of largest k elements sumk=0; int j=0; for(i=n-1;j<4;i--){ sumk+=arr[i]; j++; } // difference for k-largest int D2 = abs(arrsum - 2*sumk); int maxD=D1>=D2?D1:D2; // return maximum difference value return maxD; } // driver program 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