滑动窗口最大值
front:
1. 在 queue 容器中的用法
queue 是一种先进先出(FIFO)的数据结构, front 函数用来访问队头元素。
int main() {queue<int> q;q.push(10);q.push(20);int frontElement = q.front(); // 获取队头元素,此时frontElement的值为10cout << "Queue front element: " << frontElement << endl;return 0;
}
在这段代码中,先创建了一个 queue 对象 q ,并向其中压入两个元素。然后通过 q.front() 获取队头元素,注意 front 函数只是获取元素,不会改变队列结构,若要移除队头元素需调用 pop 函数。
2. 在 deque 容器中的用法
deque (双端队列 )允许在两端进行插入和删除操作, front 函数用于获取其头部元素。
int main() {deque<int> dq = {1, 2, 3};int first = dq.front(); // 获取双端队列头部元素,此时first的值为1cout << "Deque front element: " << first << endl;return 0;
}
这里创建了一个包含元素 {1, 2, 3} 的 deque 容器 dq ,通过 dq.front() 获取其头部元素。
3. 在 list 容器中的用法
list 是双向链表容器, front 函数用于获取链表头部元素。
int main() {list<int> lst = {4, 5, 6};int head = lst.front(); // 获取链表头部元素,此时head的值为4cout << "List front element: " << head << endl;return 0;
}
代码中创建了 list 容器 lst ,并通过 lst.front() 获取其头部元素。
pop_front:
pop_front() 是 C++ 中 双端队列( deque )、列表( list )、前向列表( forward_list ) 等容器的成员函数,用于 删除容器中第一个元素。
1. 语法
container.pop_front(); // container 为支持该操作的容器
2. 适用容器
- deque (双端队列):高效删除头部元素。
- list (双向链表):直接删除头部节点。
- forward_list (单向链表):需注意迭代器有效性。
注意: vector 不支持 pop_front() ,因其头部删除效率低(需移动后续元素)。
3. 示例
int main() {deque<int> dq = {1, 2, 3};dq.pop_front(); // 删除第一个元素(1)// 此时 dq 变为 {2, 3}return 0;
}
4. 注意事项
调用前需确保容器 非空,否则行为未定义(可能崩溃)。
操作后,容器大小减 1,头部元素变为原第二个元素(若存在)。
pop_back:
pop_back() 是 C++ 中用于 删除容器尾部元素 的成员函数,适用于 vector、deque、list、string 等容器( forward_list 不支持)。
用法示例:
int main() {vector<int> vec = {1, 2, 3, 4};vec.pop_back(); // 删除尾部元素 4,容器变为 {1, 2, 3}cout << "尾部元素:" << vec.back() << endl; // 输出 3return 0;
}
注意:
- 容器必须非空,否则调用会导致未定义行为(程序崩溃)。
- 操作会直接修改容器,返回值为 void(不返回被删除元素)。
push_back:
push_back() 是C++ 中用于在容器尾部添加元素的成员函数,常用于 vector 、 deque 、 list 和 string 等容器。以下是其用法示例:
int main() {// 创建一个空的vector容器vector<int> vec;// 使用push_back()向容器中添加元素vec.push_back(1);vec.push_back(2);vec.push_back(3);// 输出容器中的元素for (int i : vec) {cout << i << " ";}return 0;
}
上述代码创建了一个 vector 容器,并使用 push_back() 函数向容器中添加了三个元素,最后通过循环输出了容器中的所有元素。
使用 push_back() 时需要注意,对于 vector 容器,如果当前容器的容量已满,在调用 push_back() 时会自动进行扩容操作,以确保有足够的空间来存储新元素。
que.front:
que.front() 是 C++ 中 队列( queue )容器适配器 的成员函数,用于 访问队列头部元素(即最早插入的元素)。
用法示例:
int main() {std::queue<int> q;q.push(10); // 入队:头部元素为 10q.push(20); // 入队:头部仍为 10(队列先进先出)cout << "头部元素:" << q.front() << endl; // 输出 10q.pop(); // 删除头部元素(10)cout << "新头部元素:" << q.front() << endl; // 输出 20return 0;
}
注意事项:
1. 队列必须非空:若队列为空时调用 front() ,会导致未定义行为(程序崩溃)。
2. 返回值类型:返回队列头部元素的 引用( T& ),可通过 const 版本( const T& )访问常量队列元素。
3. 与栈的区别:栈( stack )使用 top() 访问栈顶元素(最后插入的元素),而队列使用 front() 访问头部元素(最早插入的元素)。
239. 滑动窗口最大值
给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6 7 51 3 -1 -3 [5 3 6] 7 61 3 -1 -3 5 [3 6 7] 7
示例 2:
输入:nums = [1], k = 1 输出:[1]
class Solution {
private:class MyQueue { // 单调队列(从大到小)public:deque<int> que; // 使用deque来实现单调队列// 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。// 同时pop之前判断队列当前是否为空。void pop(int value) {if (!que.empty() && value == que.front()) {que.pop_front();}}// 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。// 这样就保持了队列里的数值是单调从大到小的了。void push(int value) {while (!que.empty() && value > que.back()) {que.pop_back();}que.push_back(value);}// 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。int front() {return que.front();}};
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {MyQueue que;vector<int> result;for (int i = 0; i < k; i++) { // 先将前k的元素放进队列que.push(nums[i]);}result.push_back(que.front()); // result记录前k的元素的最大值for (int i = k; i < nums.size(); i++) {que.pop(nums[i - k]); // 滑动窗口移除最前面元素que.push(nums[i]); // 滑动窗口前加入最后面的元素result.push_back(que.front()); // 记录对应的最大值}return result;}
};
在子函数Myqueue类中定义一个deque(双端队列)对象que,用于存储元素,实现单调队列功能。 定义了一个成员函数pop,接受一个int类型的参数value,用于从队列中弹出指定元素。判断要弹出的值是否为空且弹出的值value等于头部元素。如果满足条件,从队列头部弹出元素。 定义成员函数push,接受一个int类型参数value,用于将元素添加到队列中。当队列非空且新元素value大于队列尾部元素时,进入循环。弹出队列尾部元素,直到新元素不大于队列尾部元素。跳出循环。将新元素value添加到队列尾部。 定义成员函数front,用于获取队列头部元素。返回队列头部元素。 在主在 Solution 类中定义一个公有成员函数 maxSlidingWindow ,接收一个整数数组 nums 和窗口大小 k ,返回一个整数数组,用于求解滑动窗口的最大值。 创建一个 MyQueue 对象 que ,用于维护单调队列。 创建一个 vector 对象 result ,用于存储每个滑动窗口的最大值。循环将数组 nums 的前 k 个元素依次加入单调队列 que 。将 nums[i] 加入单调队列。将前 k 个元素构成的窗口的最大值(即队列头部元素)加入结果数组 result 。从第 k 个元素开始遍历数组 nums ,模拟滑动窗口移动。移除滑动窗口最前面的元素(即离开窗口的元素)。将滑动窗口新加入的元素添加到单调队列。将当前滑动窗口的最大值加入结果数组 result 。返回存储所有滑动窗口最大值的结果数组 result 。