快慢指针(寻找在一定范围内包含的成员个数)

Posted ___Charles

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快慢指针(寻找在一定范围内包含的成员个数)相关的知识,希望对你有一定的参考价值。


你的团队中有 n 个人,每个人有一个能力值 ai,现在需要选择若干个人组成一个团队去参加比赛,由于比赛的规则限制,一个团队里面任意两个人能力的差值必须要小于等于 k ,为了让更多的人有参加比赛的机会,你最多能选择多少个人参加比赛?

 

 

链接:https://ac.nowcoder.com/acm/contest/5158/B

一开始我一直在纠结以哪个点为中心,然后就分别以每个顶点为开头去找最末尾,n2的时间复杂度TL了,后面看大佬的题解,所以可以一遍过就找到最大值-最小值为K的最大成员区间,%%%%%

#include<bits/stdc++.h>
using namespace std;
int n,T,k;
int a[200005];
int ans;

int main()
{
	scanf("%d",&T);
	while(T--)
	{
		ans=0;
	    scanf("%d%d",&n,&k);
    	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	    sort(a,a+n);
	    int l=0,r=0;//一开始两个指针都指向开头
        while(l<=n-1)
        {
            while(a[r]-a[l]<=k&&r<=n-1) r++;//当满足时候,r不断往前走直到不满足
            ans=max(ans,r-l);//判断下当前是否为最大
            l++;//l向前走
        }
		printf("%d\\n",ans);
			
	}	
}

  

 

 

以上是关于快慢指针(寻找在一定范围内包含的成员个数)的主要内容,如果未能解决你的问题,请参考以下文章

快慢指针实现不依赖计数器寻找中位数(linked list)

Leetcode287. 寻找重复数(数组模拟链表的快慢指针法)

Leetcode287. 寻找重复数(数组模拟链表的快慢指针法)

环的入口节点

利用快慢指针寻找链表中间节点

一文学会链表快慢指针解题技巧