huawei0821筆試第二題筆記:雙端佇列deque

axuu發表於2024-08-29
int solve(deque<int> machines, const vector<int>& tasks){
    for(int task : tasks){
        int cnt = 0;
        //首件不匹配
        while(cnt < machines.size() && task != machines.front()){
            machines.push_back(machines.front());
            machines.pop_front();
            cnt++;
        }
        //首件與所有的執行機不匹配,比首件匹配先進行判斷,因為tasks中不會刪除
        if(cnt >= machines.size()){
            break;
        }
        //首件匹配
        if(task == machines.front()){
            machines.pop_front();
        }
    }
    return machines.size();
}

注意引數列表,兩個引數的資料型別

1.引數列表

函式接受兩個引數:

  • deque<int> machines:

    • 這是一個傳值引數,它是一個 deque(雙端佇列)容器,儲存了 int 型別的元素。
    • deque<int> 允許在佇列的兩端高效地插入和刪除元素。這個引數是按值傳遞的,因此函式會得到 machines 的一個複製,而不是對原來的 deque 進行修改。
  • const vector<int>& tasks:

    • 這是一個常量引用引數,型別為 vector<int>,即 tasks 是一個儲存 int 型別元素的 vector 容器。
    • const 關鍵字表示函式不能修改 tasks 的內容,保證其只讀性。
    • & 表示按引用傳遞,這意味著 tasks 是按引用傳遞的,因此在函式內部不會複製整個 vector,而是使用它的原始引用。這種方式效率較高,特別是在傳遞大型容器時。

2.for迴圈中break到底是跳出一次迴圈還是全部迴圈

在 C++ 中,for 迴圈內的 break 語句用於立即終止迴圈的執行,並跳出迴圈體。無論迴圈條件是否仍為真,一旦遇到 break 語句,迴圈就會停止,並且程式將繼續執行迴圈之後的語句。

3.雙端佇列

雙端佇列(Deque,Double-Ended Queue) 是一種抽象資料結構,它允許在佇列的兩端進行插入和刪除操作。與普通佇列(只能在一端進行插入,另一端進行刪除)不同,雙端佇列允許在兩端都進行插入和刪除操作,因此它既可以用作棧(LIFO)也可以用作佇列(FIFO)。

雙端佇列的特點

  1. 雙端操作: 可以在佇列的前端和後端進行插入和刪除操作。
  2. 動態大小: 可以根據需要動態調整大小。
  3. 靈活性: 既可以用作佇列(先進先出,FIFO),也可以用作棧(後進先出,LIFO)。

雙端佇列的常見操作

在雙端佇列中,常見的操作包括:

  • push_front(item): 在佇列的前端插入一個元素。
  • push_back(item): 在佇列的後端插入一個元素。
  • pop_front(): 移除並返回佇列的前端元素。
  • pop_back(): 移除並返回佇列的後端元素。
  • front(): 返回佇列的前端元素(不移除)。
  • back(): 返回佇列的後端元素(不移除)。
  • empty(): 檢查佇列是否為空。
  • size(): 返回佇列中的元素數量。

C++ 中的雙端佇列

在 C++ 標準模板庫(STL)中,std::deque 是用於表示雙端佇列的容器。std::deque 提供了 O(1) 時間複雜度的雙端插入和刪除操作。

雙端佇列(Deque)是一種靈活的線性資料結構,支援高效的雙端插入和刪除操作。它結合了棧和佇列的優點,適合在需要從兩端進行操作的場景下使用。std::deque 是 C++ 標準庫中提供的雙端佇列實現,使用簡單且高效。

雙端佇列的應用場景

  1. 滑動視窗問題: 在演算法中,雙端佇列可以用來高效地解決滑動視窗問題,例如求滑動視窗的最大值或最小值。
  2. 排程系統: 可以用來實現需要從兩端操作的任務排程系統。
  3. 快取系統: 使用雙端佇列來實現最近最少使用(LRU)快取。
  4. 瀏覽器歷史記錄: 可以用雙端佇列來實現瀏覽器的前進和後退操作。

相關文章