最大最小N个数之和

题目描述:

给定一个数组,编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。

说明:

数组中数字范围[0, 1000]

最大N个数与最小N个数不能有重叠,如有重叠,输入非法返回-1

输入非法返回-1

输入描述:

第一行输入M, M标识数组大小\n第二行输入M个数,标识数组内容

第三行输入N,N表达需要计算的最大、最小N个数

输出描述:

输出最大N个数与最小N个数的和。

示例1

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

5

95 88 83 64 100

2

输出

342

说明

最大2个数[100,95],最小2个数[83,64], 输出为342。

示例2

输入输出示例仅供调试,后台判题数据一般不包含示例

输入

5

3 2 3 4 2

2

输出

-1

说明

最大2个数[4,3],最小2个数[3,2], 有重叠输出为-1。

解题思路:先对数组进行排序使用快速排序算法,然后清除数组中重复的数据,再将前N个和后N个数相加。

`#include
using namespace std;

void quicksort(int *a,int start,int end)
{
int axi,left,right;
left=start;
right=end;
if(start<end)//表示终止条件
{
axi=a[left];
while(left<right)
{
while(a[right]>=axi&&left<right) right--;
if(left<right) a[left]=a[right];
while(a[left]<=axi&&left<right) left++;
if(left<right) a[right]=a[left];
}
a[right]=axi;
quicksort(a,start,right-1);
quicksort(a,right+1,end);
}
}

int main(){
int M,N,a[1001]={0},sum=0,count;
cin>>M;
for(int i=0;i<M;i++)
cin>>a[i];
cin>>N;
if(2*N>M)
{
cout<<-1;
return 0;
}
quicksort(a,0,M-1);
for(int i=0,j=1;j<M;j++)
{
if(a[i]!=a[j])
a[++i]=a[j];
count=i;
}
if(a[N-1]>=a[count-N+1])
{
cout<<-1;
return 0;
}
for(int i=0;i<N;i++)
sum+=(a[i]+a[M-i-1]);
cout<<sum;
return 0;
}`

时间复杂度:排序Mlog(M),清除重复元素是M,头尾N个数相加为2N;最终时间复杂度为:O(M*log(M))。
空间复杂度:用了一个大小为M的整型数组,空间复杂度为:O(M)

posted @ 2024-07-05 16:48  jenniferCAI  阅读(64)  评论(0)    收藏  举报