求绳子最多能覆盖的点
2013-10-02 11:38
1181 查看
数轴上有一系列点a[0],a[1],a[2]......a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖的点的个数。
算法思路:用两个指针,初始值设为i=0,j=1;求出以i为起点最多能覆盖的点数maxNum,然后i和j都往后移动一步,如果a[j]-a[i]<=L,说明绳子可以覆盖更多的点,把i固定,求出新的maxNum,后面的操作重复前面的循环,直至j碰到最后一个点为止。算法复杂度真正为O(n),因为外层和里层while循环都控制着变量j++。网上关于这道题的解法不一,但自认为这是最好的解法。
算法思路:用两个指针,初始值设为i=0,j=1;求出以i为起点最多能覆盖的点数maxNum,然后i和j都往后移动一步,如果a[j]-a[i]<=L,说明绳子可以覆盖更多的点,把i固定,求出新的maxNum,后面的操作重复前面的循环,直至j碰到最后一个点为止。算法复杂度真正为O(n),因为外层和里层while循环都控制着变量j++。网上关于这道题的解法不一,但自认为这是最好的解法。
#include <stdio.h> int overrideMaxNum(int *points,int pointsNum,int L) { int maxNum=1,i=0,j=1; if(L<=0||points==NULL||pointsNum<=0)return 0; while(j<pointsNum) { while(j<pointsNum&&points[j]-points[i]<=L) { maxNum++; j++; } i++; j++; } return maxNum; } int main() { int points[10]={1,2,3,4,10,15,17,18,19,20}; printf("%d\n",overrideMaxNum(points,10,3)); return 0; }
相关文章推荐
- 百度笔试题:绳子最多覆盖多少个点
- [经典面试题][百度]数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
- 绳子可以覆盖的最多点数
- 数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。
- [经典面试题][百度]数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
- 数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。
- 百度笔试题:绳子最多覆盖多少个点
- 数轴上n个点(a0,a1,.....an),长为L的绳子最多能覆盖多少个点。
- 数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。
- 数轴上从左到右有n个点、a[0] a[1]……a[n-1]给定一根长度为l绳子、求绳子最多覆盖其中几个点
- 给定一系列x轴的点坐标,例如 1,3,7,8,9,11这些坐标升序放在数组中,现在给一根绳子,长度为4,问绳子最多能覆盖的点数有多少,例如绳子放前面只能覆盖两个点,1,3,如果放后面能覆盖4个点。
- 贪心算法解决最少圆覆盖最多点问题
- ZOJ 3597 Hit the Target! (线段树扫描线 -- 矩形所能覆盖的最多的点数)
- 【Codeforces Testing Round 12B】【贪心】Restaurant 选取数量最多的不覆盖区间数
- UVa 10535 - Shooter (最多区间覆盖的点 + 扫描)
- 定长线段最多覆盖点的个数
- 尺子最多覆盖多少点
- HDU 1883 Phone Cell (圆覆盖最多点)
- HDU 3335 Divisibility(DLX求最多重复覆盖)
- hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙