当前位置: 首页 > news >正文

滑动窗口最大值

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 。

相关文章:

  • @RequestParam使用场景
  • GUI图形化演示
  • 三轴云台之远程控制与通信技术篇
  • Element Plus 取消el-form-item点击触发组件,改为原生表单控件
  • ​​STC51系列单片机引脚分类与功能速查表(以STC89C52为例)​
  • java每日精进 5.15【分页实现】
  • 自学嵌入式 day 18 - 数据结构 1
  • Seata源码—3.全局事务注解扫描器的初始化一
  • Ansys Zemax | 在 MATLAB 或 Python 中使用 ZOS-API 进行光线追迹的批次处理
  • Web》》url 参数 # 、 ? 、@
  • element ui 级联列表Cascader懒加载数据回显的优雅解决方案
  • LocalDateTime类型的时间在前端页面不显示或者修改数据时因为LocalDateTime导致无法修改,解决方案
  • 会计要素+借贷分录+会计科目+账户,几个银行会计的重要概念
  • 【J2】乘法逆元
  • 将b[索引]中元素按照a中元素的值进行排序
  • C++核心编程--1 内存分区模型
  • python打卡day26
  • 如何在线免费压缩PDF文档?
  • 【MySQL】多表连接查询
  • 各个历史版本mysql/tomcat/Redis/Jdk/Apache/gitlab下载地址
  • 科普|认识谵妄:它有哪些表现?患者怎样走出“迷雾”?
  • 受贿1.29亿余元,黑龙江省原副省长王一新被判无期
  • 350种咖啡主题图书集结上海,20家参展书店买书送咖啡
  • 国税总局上海市税务局通报:收到王某对刘某某及相关企业涉税问题举报,正依法依规办理
  • 刘晓庆被实名举报涉嫌偷税漏税,税务部门启动调查
  • 北方产粮大省遭遇气象干旱,夏粮用水如何解决?