## @[TOC](这数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。时间复杂度最短(n) C++ 数组 经典 模拟法)

题目
数轴上有N个点,求一条长度为K的线段最多覆盖多少个点?

思路
两个指针,i指向头,l指向尾。
如果w[i]-w[l]<k,头i向前移动一步。
如果w[i]-w[l]>=k,尾巴l向前移动一步。
每个数最多遍历2遍,因此时间复杂度为O(n)。
对于这个算法,某网友给了一个形象的比喻:
就好像一条长度为L的蛇。头伸不过去的话,就把尾巴缩过来最多只需要走一次,就知道能覆盖几个点。
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int w[100010];
int main()
{
    int n;
    int k;
    cin>>n>>k;
    for(int i = 1; i <= n; i++){
    	cin>>w[i];
	}    
    int l = 1;// 尾
    int m = 1;
    for(int i=1; i<= n; i++) {//头
        while(w[i]-w[l]>=k){
            l++;
        }
       // m = max(m,i-l+1);
        if(i-l>=m){
        	m=i-l+1; 
		}
    }
    cout<<m<<endl;
    return 0;
}

这道题要点:
1.注意在遍历的时候头和尾都不会后退,所以定义头和尾的初始值时在循环外面定义。
2.题目中给定的数组是有序数组,不用考虑把每两个点的间隔用数组储存起来。。。,这样会把问题复杂化,因为数组是有序数组,刚刚好每一段距离,不管是多远,只需要两个值相减就出来了,同时,我们求每一段距离包含的数字个数,只需要头和尾的指针相减再加一就可以了。
3.注意外层循环最好遍历为头。’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值