[经典面试题][百度]数轴上从左到右有n各点a[0], a[1], ……,a[n -1],给定一根长度为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;
    }

如果本方法有什么问题,欢迎指正。如果有更好的方法,欢迎指导。

目录
相关文章
|
11月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
122 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
存储 缓存 安全
兄弟面试了百度,面试题分享一波
兄弟面试了百度,面试题分享一波
141 0
|
机器学习/深度学习 自然语言处理 算法
百度2024校招机器学习、数据挖掘、自然语言处理方向面试经历
百度2024校招机器学习、数据挖掘、自然语言处理方向面试经历
366 2
面试美团、头条、百度、京东,一名3年Java开发经验的面试总结
毕业转行做开发3年以来, 学到了很多, 加上自己的兴趣爱好, 个人认为已经成为了一个合格的程序员. 与刚开始找工作面试相同的是都会问一些相同的问题, 不同的是现在面试官会更注重为什么, 也就是说注重深度而非广度. 3年, 5年, 10年分别是个人从事技术方面职业规划中的一个坎, 3年大部分时间应对了业务逻辑, 培养良好的规范和思想, 基础知识还是欠缺.
|
存储 前端开发 JavaScript
【面试题】(简单粗暴点)百度一面,直接问痛我
【面试题】(简单粗暴点)百度一面,直接问痛我
121 0
|
Linux 应用服务中间件 数据库
Linux 面试题-(腾讯,百度,美团,滴滴)
Linux 面试题-(腾讯,百度,美团,滴滴)
133 0
|
存储 SQL 设计模式
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案
1124 0
|
存储 安全 前端开发
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案(下)
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案
|
JavaScript 开发工具 git
大厂面试-百度
大厂面经-百度
151 0
一道网红面试题(腾讯、百度面试中都出现过)
在腾讯和百度的面试中,出现了这样一道面试题,,被大家亲切的称呼为网红面试题,这道面试题就是。['1', '2', '3'].map(parseInt)的输出结果是什么?['1', '2', '3'].fliter(parseInt)的输出结果是什么? 这个面试题,面试官可能不仅仅需要你说出他的结果,还需要你知道为什么会出现这样的结果。
219 0