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)。
雙端佇列的特點
- 雙端操作: 可以在佇列的前端和後端進行插入和刪除操作。
- 動態大小: 可以根據需要動態調整大小。
- 靈活性: 既可以用作佇列(先進先出,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++ 標準庫中提供的雙端佇列實現,使用簡單且高效。
雙端佇列的應用場景
- 滑動視窗問題: 在演算法中,雙端佇列可以用來高效地解決滑動視窗問題,例如求滑動視窗的最大值或最小值。
- 排程系統: 可以用來實現需要從兩端操作的任務排程系統。
- 快取系統: 使用雙端佇列來實現最近最少使用(LRU)快取。
- 瀏覽器歷史記錄: 可以用雙端佇列來實現瀏覽器的前進和後退操作。