求绳子最多能覆盖的点

本文介绍一种高效算法,用于解决给定长度的绳子能在数轴上覆盖的最大点数问题。通过双指针技巧实现O(n)的时间复杂度,提供完整C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数轴上有一系列点a[0],a[1],a[2]......a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖的点的个数。

算法思路:用两个指针,初始值设为i=0,j=1;求出以i为起点最多能覆盖的点数maxNum,然后i和j都往后移动一步,如果a[j]-a[i]<=L,说明绳子可以覆盖更多的点,把i固定,求出新的maxNum,后面的操作重复前面的循环,直至j碰到最后一个点为止。算法复杂度真正为O(n),因为外层和里层while循环都控制着变量j++。网上关于这道题的解法不一,但自认为这是最好的解法。

#include <stdio.h>
int overrideMaxNum(int *points,int pointsNum,int L)
{
	int maxNum=1,i=0,j=1;
	if(L<=0||points==NULL||pointsNum<=0)return 0;
	while(j<pointsNum)
	{
		while(j<pointsNum&&points[j]-points[i]<=L)
		{
			maxNum++;
			j++;
		}
		i++;
		j++;
	}
	return maxNum;
}
int main()
{
	int points[10]={1,2,3,4,10,15,17,18,19,20};
	printf("%d\n",overrideMaxNum(points,10,3));
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值