关闭

绳子可以覆盖的最多点数

384人阅读 评论(0) 收藏 举报
分类:

有网友指出,我的算法其实没必要申请多余的数组,那么有没有更加高效的算法呢,我身边的一个大神给了我一个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;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:136269次
    • 积分:2779
    • 等级:
    • 排名:第12937名
    • 原创:134篇
    • 转载:106篇
    • 译文:1篇
    • 评论:6条