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)缓存。
- 浏览器历史记录: 可以用双端队列来实现浏览器的前进和后退操作。