最大最小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)