做这道题的时候,我先想到了用队列来做,每次遍历排好序的数组数组元素,把它们放到队尾,然后再和队头相减,看是否大于k,如果绝对值大于k,那就说明要排出队头。想法是这样,但是实现有点难度。而且应该是不对的,每次只能是队头和队尾相减(审题有问题)。
看了题解后,太巧妙了,也是先把数组排好序,遍历前先设置一个默认长度temp=1(默认只有一个数字),遍历排好序的数组,每次看前一位数字和后一位数字相减绝对值是否符合条件,如果符合条件,就temp++,(说明这一组数字都是符合的);如果不符合就temp=1,重新开始寻找符合条件的数字组
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N=200010;
int a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int temp=1,max1=1;
for(int i=0;i<n-1;i++)
{
if(abs(a[i]-a[i+1])<=k)
temp++;
else
{
temp=1;
}
max1=max(temp,max1);
}
cout<<n-max1<<endl;
}
}