有网友指出,我的算法其实没必要申请多余的数组,那么有没有更加高效的算法呢,我身边的一个大神给了我一个O(N)复杂度的算法:
他的原话:两个指针,一个front,一个rear,每次front-rear,比L小,看覆盖的点数。保存覆盖点数的最大值,然后front++;比L大,rear++,每个数最多遍历2遍,复杂度O(N)。
对于这个算法,他给了一个形象的比喻:
就好像一条长度为L的蛇。头伸不过去的话,就把尾巴缩过来最多只需要走一次,就知道能覆盖几个点
int line(int a[],int n,int len)
{
int front,rear,maxnum;
front = rear = maxnum = 0;
while(front < n)
{
if(a[front] - a[rear] <= len)
{
maxnum = fmax(maxnum,front-rear);
front++;
}
else
rear++;
}
return maxnum+1;
}