[经典面试题][百度]数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
2015-02-08 11:21
423 查看
题目
数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
思路一
遍历所有区间跟绳子L比较。
i遍历区间起点,j遍历区间终点。
时间复杂度为O(n^2)
代码一
思路二
两个指针,start,end。
如果points[front]-points[rear]<=L,头start向前移动一步。
如果points[front]-points[rear]>L,尾巴end向前移动一步。
每个数最多遍历2遍,因此时间复杂度为O(n)。
对于这个算法,某网友给了一个形象的比喻:
就好像一条长度为L的蛇。头伸不过去的话,就把尾巴缩过来最多只需要走一次,就知道能覆盖几个点
代码二
如果本方法有什么问题,欢迎指正。如果有更好的方法,欢迎指导。
数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。
思路一
遍历所有区间跟绳子L比较。
i遍历区间起点,j遍历区间终点。
时间复杂度为O(n^2)
代码一
/*------------------------------------- * 日期:2015-02-08 * 作者:SJF0115 * 题目: 绳子覆盖 * 来源:百度2014 * 博客: ------------------------------------*/ #include <iostream> #include <vector> #include <cstring> #include <algorithm> using namespace std; class Solution { public: // points 给定点 L 绳子长度 int RopeCover(vector<int> points,int L) { int size = points.size(); if(size <= 0){ return 0; }//if // 所能覆盖的最多点数 int max = 0; int start = 0,end = 0; // i起点 j终点 遍历所有区间; for(int i = 0;i < size-1;++i){ for(int j = i+1;j < size;++j){ if(points[j] - points[i] <= L && j - i + 1 > max){ max = j - i + 1; start = i; end = j; }//if } }//for cout<<"起点->"<<start<<" 终点->"<<end<<endl; return max; } }; int main(){ Solution s; vector<int> points = {-1,0,3,9,11,25}; int L = 15; int result = s.RopeCover(points,L); // 输出 cout<<result<<endl; return 0; }
思路二
两个指针,start,end。
如果points[front]-points[rear]<=L,头start向前移动一步。
如果points[front]-points[rear]>L,尾巴end向前移动一步。
每个数最多遍历2遍,因此时间复杂度为O(n)。
对于这个算法,某网友给了一个形象的比喻:
就好像一条长度为L的蛇。头伸不过去的话,就把尾巴缩过来最多只需要走一次,就知道能覆盖几个点
代码二
/*------------------------------------- * 日期:2015-02-08 * 作者:SJF0115 * 题目: 绳子覆盖 * 来源:百度2014 * 博客: ------------------------------------*/ #include <iostream> #include <vector> #include <cstring> #include <algorithm> using namespace std; class Solution { public: // points 给定点 L 绳子长度 int RopeCover(vector<int> points,int L) { int size = points.size(); if(size <= 0){ return 0; }//if // 所能覆盖的最多点数 int max = 0; int start = 1,end = 0; int maxS = 0,maxE = 0; while(end < start){ if(points[start] - points[end] <= L){ if(start - end + 1 > max){ max = start - end + 1; maxS = end; maxE = start; }//if // 头向前移动一格 ++start; }//if else{ // 尾巴向前移动一格 ++end; } }//while cout<<"起点->"<<maxS<<" 终点->"<<maxE<<endl; return max; } }; int main(){ Solution s; vector<int> points = {-1,3,4,9,11,25}; int L = 8; int result = s.RopeCover(points,L); // 输出 cout<<result<<endl; 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的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。
- 数轴上从左到右有n个点、a[0] a[1]……a[n-1]给定一根长度为l绳子、求绳子最多覆盖其中几个点
- 数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。
- 给定一系列x轴的点坐标,例如 1,3,7,8,9,11这些坐标升序放在数组中,现在给一根绳子,长度为4,问绳子最多能覆盖的点数有多少,例如绳子放前面只能覆盖两个点,1,3,如果放后面能覆盖4个点。
- 坐标轴上从左到右依次的点为a[0]、a[1]、a[2]……a[n-1],设一根木棒的长度为L,求L最多能覆盖坐标轴的几个点?
- 坐标轴上从左到右依次的点为a[0]、a[1]、a[2]……a[n-1],设一根木棒的长度为L,求L最多能覆盖坐标轴的几个点?
- 32. 百度面试题:用天平(只能比较,不能称重)从一堆小球中找出其中唯一一个较轻的,使用x次天平,最多可以从y个小球中找出较轻的那个,求y与x的关系式
- 百度面试题——未知长度链表中随机取出其中某一节点的值
- 数轴上n个点(a0,a1,.....an),长为L的绳子最多能覆盖多少个点。
- 百度笔试题:绳子最多覆盖多少个点
- [经典面试题][百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数。
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
- 百度笔试题:绳子最多覆盖多少个点
- 给定的文本中,查找其中最长的重复子字符串(面试题)
- 第21 题 2010 年中兴面试题 编程求解: 输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数, 使其和等于m ,要求将其中所有的可能组合列出来.
- 经典面试题(二)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 经典面试题(四)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 微软、google、雅虎、百度等各大著名公司的经典面试题!保证搞晕你!!