思路补充在注释里.
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
int q[1000],p[1000],num[1000];
int fmin(int a,int b)
{
if(a<b)
return a;
return b;
}
int fabs(int a)
{
if(a<0)
return -a;
return a;
}
bool cmp(int a,int b)// 通过这个函数可以使数据按从小到大进行排列
{
return a<b;
}
int main()
{
int n,m,s,e,l,r,i,minn;
while(scanf("%d%d",&n,&m)!=EOF)
{
minn=1000000000;
s=0,e=-1,l=0,r=-1;
for(i=0;i<m;i++)
{
scanf("%d",&num[i]);
}
sort(num,num+m,cmp);
for(i=0;i<m;i++)
{
while(s<=e&&num[i]>=num[q[e]])
{
e--;
}
q[++e]=i;//实现q[0]=i,不断赋给新的i值。
while(s<=e&&i-q[s]>=n)//s=0
{
s++;
}
while(l<=r&&num[i]<=num[p[r]])
{
r--;
}//此循环不会执行;理由:num[i]会大于num[p[r]]。
p[++r]=i;//故而p[0]=0,即p[i]=i。
while(l<=r&&i-p[l]>=n)//当i>=n-1时让l进行l++
{
l++;
}
if(i>=n-1&&fabs(q[s]-p[l])<=n)//由于q[s]相当于i对应当下的值,作用等同于判断i>=n-1是否满足;
minn=fmin(minn,fabs(num[q[s]]-num[p[l]]));//求得每n个数最大值与最小值的差,进行比较判断.
}
printf("%d\n",minn);
}
return 0;
}
思路: