这个题目的难点在于理解:因为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<<"最大的覆盖个数:"<