给定一个数组arr[]和一个数字K,任务是找到K个最大的偶数和奇数数组元素之和的绝对差。
注意:至少有K个偶数和奇数元素分别出现在数组中。
例子:
输入arr [] = {1, 2, 3, 4, 5, 6}, K = 2简单方法:最简单的方法是遍历数组找到K个最大的偶数和K个最大的奇数,然后打印得到的K个最大的偶数和奇数元素之和之间的绝对差。
输出:2
说明:
2个最大偶数为6、4。总和为6 + 4 =10。
2个最大奇数数字是5、3。总和是5 + 3 =8。
差= 10 – 8 =2。
输入arr [] = {1、8、4、5、6、3}, K = 3
输出:4
说明:
3个最大偶数是8、6、4。总和是8 + 6 + 4 =18。
3个最大奇数是5、3、1。总和是5 + 3 + 1 =9。
差= 18 – 9 = 9。
时间复杂度:O(N * K)
辅助空间:O(1)
高效方法:为了优化上述方法, 想法是使用将数组分为奇数和偶数然后将数组按降序分为两部分, 分别包含偶数和奇数。请按照以下步骤解决问题:
- 将给定数组中的偶数和奇数分开并从奇数开始存储索引。
- 让索引从奇数开始?。对范围内的数字进行排序[0, K – 1]和[K, N – 1]以降序排列。
- 第一个的总和?从数组开头到奇数开头的数字是第一个和最大K数组中的偶数和奇数。
- 打印上一步中计算出的总和之间的绝对差作为结果。
C ++
//C++ program for the above approach#include <
bits/stdc++.h>
using namespace std;
//Function to find the absolute
//difference between sum of first K
//maximum even and odd numbers
void evenOddDiff( int a[], int n, int k)
{
//Stores index from where odd
//number starts
int j = -1;
//Segregate even and odd number
for ( int i = 0;
i <
n;
i++) {//If current element is even
if (a[i] % 2 == 0) {
j++;
swap(a[i], a[j]);
}
}j++;
//Sort in decreasing order even part
sort(a, a + j, greater<
int>
());
//Sort in decreasing order odd part
sort(a + j, a + n, greater<
int>
());
int evenSum = 0, oddSum = 0;
//Calculate sum of k
//maximum even number
for ( int i = 0;
i <
k;
i++) {
evenSum += a[i];
}//Calculate sum of k
//maximum odd number
for ( int i = j;
i <
(j + k);
i++) {
oddSum += a[i];
}//Print the absolute difference
cout <
<
abs (evenSum - oddSum);
}//Driver Code
int main()
{
//Given array arr[]
int arr[] = { 1, 8, 3, 4, 5 };
//Size of array
int N = sizeof (arr) /sizeof (arr[0]);
int K = 2;
//Function Call
evenOddDiff(arr, N, K);
return 0;
}
输出如下:
4
时间复杂度:O(N * log N + K)
【算法题(K个最大偶数和奇数数组元素之和之间的差)】辅助空间:O(1)
推荐阅读
- 二叉树的奇数级和偶数级节点之和之间的差
- 结构化,半结构化和非结构化数据之间的差异
- 停止和等待,GoBackN和选择性重复之间的区别
- SQL和NoSQL之间有什么区别(有哪些区别?)
- Spring和Spring Boot之间有什么区别()
- 假脱机和缓冲之间有什么区别()
- C#中SortedList和SortedDictionary之间的区别
- #yyds干货盘点# Centos7安装kvm虚拟机(使用virt-install管理)
- 鸿蒙轻内核源码分析(虚拟文件系统VFS)