1. 程式人生 > >[經典面試題][百度]數軸上從左到右有n各點a[0], a[1], ……,a[n -1],給定一根長度為L的繩子,求繩子最多能覆蓋其中的幾個點。

[經典面試題][百度]數軸上從左到右有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;
    }

如果本方法有什麼問題,歡迎指正。如果有更好的方法,歡迎指導。

相關推薦

[經典試題][]數軸左到右na[0], a[1], ……,a[n -1]給定長度L繩子繩子多能覆蓋其中

題目 數軸上從左到右有n各點a[0], a[1], ……,a[n -1],給定一根長度為L的繩子,求繩子最多能覆蓋其中的幾個點。 思路一 遍歷所有區間跟繩子L比較。 i遍歷區間起點,j遍歷區間終

經典試題——矩陣的左上角到右下角多少種方法

不多說,程式碼獻上,三種方法 #include <iostream> using namespace std; int mat[11][11]; int dp[11]; int main() { int n, m; int i, j; //樸素DP

2018年web前端經典試題總結你能做對

對程式設計師小哥哥小姐姐來說,很多時候差的不是技術,卻過不了面試那一關。這時候我們就需要總結分析一下面試題目了,揣摩公司與hr的心理及需求,有時候我們忽略的小問題就是決定能不能拿到offer的重要因素,希望大家都可以找到自己心儀的工作,從容應對面試~ 1、webpack怎麼引入第三方的庫?

使用Python地圖批量下載興趣(POI)

背景 編寫這個工具完全是因為資料採集專案需要,由於POI野外採集十分繁瑣,需要定位並錄入名稱、地址等資訊,為了減輕外業人員的負擔,我想到百度地圖上有相關的POI介面可以呼叫,如果能從百度地圖上下載到這

Linux下C語言的經典試題

ref 使用 linu 學習資源 chan ima 什麽 img c語言 本篇文章整理了幾道Linux下C語言的經典面試題,相信對大家更好的理解Linux下的C語言會有很大的幫助,歡迎大家探討指正。 1、如果在Linux下使用GCC編譯器執行下列程序,輸出結果是什麽? 答

基礎 | 36經典試題來測測您的Java基礎

到此為止,「Java基礎」系列的面試點已更新完畢,但關於Java NIO和Java8新特性之Lambda表示式部分的內容還停留在概述階段,不夠系統和深入,後續有機會再深入學習和更新。 在此,主要將Java基礎系列以面試題的形式進行彙總,用做面試前的準備與自測提綱。 公眾號後

想要年薪20萬先看會不會這28企業運維崗經典試題

while循環 詭異 man 最大 冒號 esc 其他 主動模式和被動模式 程序 1、Linux如何掛載windows下的共享目錄? mount.cifs //IP地址/server /mnt/server -o user=administrator,password=1

詳解兩佇列實現一個棧(python實現——經典試題

1、任務詳解        使用兩個佇列資料結構實現一個棧,要求實現棧的出棧和進棧操作。 2、解題思路        push()操作:        為了保證先進

詳解兩棧實現一個佇列(python實現——經典試題

1、題目說明       使用兩個棧結構,實現一個佇列功能,實現佇列的新增元素和彈出元素。       注意:       佇列特點是隻能在佇列尾部新增元素,在佇列頭部刪除元素,先進先出(FIFO/

深入淺出經典試題瀏覽器中輸入URL到頁面載入發生了什麼 - Part 2

備註: 因為文章太長,所以將它分為三部分,本文是第二部分。 第一部分:深入淺出經典面試題:從瀏覽器中輸入URL到頁面載入發生了什麼 - Part 1 TCP連線 DNS解析返回域名的IP之後,接下來就是瀏覽器要和該IP建立TCP連線了。為什麼是TCP而不是UDP?那是因為HTTP是基於TCP上的。

深入淺出經典試題瀏覽器中輸入URL到頁面載入發生了什麼 - Part 3

深入淺出經典面試題:從瀏覽器中輸入URL到頁面載入發生了什麼 - Part 3 備註: 因為文章太長,所以將它分為三部分,本文是第三部分。 第一部分:深入淺出經典面試題:從瀏覽器中輸入URL到頁面載入發生了什麼 - Part 1 第二部分:深入淺出經典面試題:從瀏覽器中輸入URL到頁

Python 經典試題: a,b兩序列,大小都n,序列元素的值任意整形數,無序, 要求: 通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差小 使

方法: 用隨機數來求出結果 解題思想: 用隨機數隨機出來所有的程式碼排列可能性,在定義次數的時候 定義的次數越大得到的結果越準確. 最終程式碼: import random #有很多方法是把兩個列表合成一個後排序按照一大一小的分配生成兩個列表 #但是這樣是在資

20「MySQL」經典試題答對轉dba 2w+「附答案」

經典題目 1、MySQL的複製原理以及流程 基本原理流程,3個執行緒以及之間的關聯; 2、MySQL中myisam與innodb的區別,至少5點 (1)、問5點不同; (2)、innodb引擎的4大特性 (3)、2者selectcount(*)哪個更快,為什麼

自己的程式碼--題目:給定一個數組裡面全是正整數。數字大小表示這多可以向後移動幾個節點。總是陣列第一個元素開始移動。問如何移動可以以最少步數移動到最後一個節點。

原文:https://yq.aliyun.com/articles/547799 描述: 題目:給定一個數組,裡面全是正整數。數字大小表示這一步最多可以向後移動幾個節點。總是從陣列第一個元素開始移動。問如何移動,可以以最少步數移動到最後一個節點。 例如:[3,4,2

28MongoDB經典試題

文章轉自:http://www.searchdatabase.com.cn/showcontent_80124.htm MongoDB是目前最好的面向文件的免費開源NoSQL資料庫。如果你正準備參加MongoDB NoSQL資料庫的技術面試,你最好看看下面的MongoDB

5JavaScript經典試題

1:Scope作用範圍 複製程式碼程式碼如下:  (function() {     var a = b = 5;  })();  console.log(b); 什麼會被列印在控制檯上? 回答 上面的程式碼會列印 5。 這個問題的訣竅是,這裡有兩個變數宣告,但 a 使用關鍵字var宣告

leetcode 經典試題之連結串列(19. 刪除連結串列的倒數第N節點)

刪除連結串列的倒數第N個節點 給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。 示例: 給定一個連結串列: 1->2->3->4->5, 和 n = 2. 當刪除了倒數第二個節點後,連結串列變為 1->

經典試題——任意兩葉節點中最近的父節點

以下程式未經測試,僅供參考! #include <iostream> #include <vector> using namespace std; struct LCATreeNode{   LCATreeNode* m_pLeft;   LC