经典指数          
原因
1624
浏览数
0
收藏数
 

给定一维数轴上的n个点a[0], a[1], ... a[n-1],现将一个长为L的棒子放在这个数轴上,求该棒子最多能覆盖多少个点。

     举报   纠错  
 
切换
1 个答案

这个题目的难点在于理解:因为a[0]到a[n]是数轴上从左到右的点(注意是数轴和从左到右),说明a数组是一个递增数组,相当于数轴上的刻度。那么从0到n-1这n个点依次遍历该起点的覆盖距离(a[j]-a[i]小于等于L.且a[j+1]-a[i]>L)取最大值即可。这种方法是两重循环O(n^2)的。优化后可达到O(n)。优化思路是借助两个指针i,j

 扫描一遍数组,在借助两个变量当前覆盖距离s和全局最大距离max来记录。当s+a[j]<=L时,j++;并更新s和max;当s+a[j]>L时,i++;更新s;继续前两步操作,直到

j 指针到达末尾。

具体代码:

#include

using namespace std;

int maxCover(int* a, int n, int l)

{

    int maxCover = 1;

    int begin = 0;

    int end = 1;

    while(end < n)

    {

        if(a[end] - a[begin] > l)

        {

            maxCover = (end - begin) > maxCover?(end -

begin):maxCover;

            begin++;

        }

        else

            end++;

    }

    return maxCover;

}

int main()

{

    int a[6] = {0,1,3,6,8,10};

   

cout<<"最大的覆盖个数:"<

    return 0;

}

 
切换
撰写答案