绳子可以覆盖的最多点数
2013-12-04 20:43
302 查看
有网友指出,我的算法其实没必要申请多余的数组,那么有没有更加高效的算法呢,我身边的一个大神给了我一个O(N)复杂度的算法:
他的原话:两个指针,一个front,一个rear,每次front-rear,比L小,看覆盖的点数。保存覆盖点数的最大值,然后front++;比L大,rear++,每个数最多遍历2遍,复杂度O(N)。
对于这个算法,他给了一个形象的比喻:
就好像一条长度为L的蛇。头伸不过去的话,就把尾巴缩过来最多只需要走一次,就知道能覆盖几个点
他的原话:两个指针,一个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; }
相关文章推荐
- 给定一系列x轴的点坐标,例如 1,3,7,8,9,11这些坐标升序放在数组中,现在给一根绳子,长度为4,问绳子最多能覆盖的点数有多少,例如绳子放前面只能覆盖两个点,1,3,如果放后面能覆盖4个点。
- 【[Offer收割]编程练习赛14 D】剑刃风暴(半径为R的圆能够覆盖的平面上最多点数目模板)
- poj 1981 Circle and Points(固定半径的圆能覆盖的最多点数)
- 数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。
- [经典面试题][百度]数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
- 每日一题(96) - 线段最多覆盖的点数
- 数轴上从左到右有n个点、a[0] a[1]……a[n-1]给定一根长度为l绳子、求绳子最多覆盖其中几个点
- 数轴上n个点(a0,a1,.....an),长为L的绳子最多能覆盖多少个点。
- poj1106Transmitters【求旋转半圆能覆盖的最多点数】
- 求绳子最多能覆盖的点
- 数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。
- 百度笔试题:绳子最多覆盖多少个点
- ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)
- POJ 1981 Circle and Points(求半径R圆覆盖最多点数及由圆上两点和半径求圆心)
- 算法题:最多覆盖点数
- 数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。
- [经典面试题][百度]数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
- 百度笔试题:绳子最多覆盖多少个点
- C#代码生成器 如果发生重构或模板变更可以直接覆盖,在自动生成之后不会被覆盖,防止误操作?
- Shell最多可以输入多少个参数?