经典指数          
原因
495
浏览数
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<<"最大的覆盖个数:"<
 
切换
撰写答案
扫描后移动端查看本题