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

【滑动窗口】【单调队列】个人练习-Leetcode-2373. Largest Local Values in a Matrix

题目链接:https://leetcode.cn/problems/largest-local-values-in-a-matrix/

题目大意:给出一个N*N矩阵,要求做池化操作,选出每个3*3矩阵的最大值,返回一个(N-2)*(N-2)矩阵

思路:这是个简单题,虽然可以暴力做,但当矩阵很大并且窗口比3*3更大时会有很多重复操作,是有改进空间的。

(1)首先我们可以对每一行维护一个单调队列qq中【存储下标】,下标对应的元素是单调递减的。想象我们要找到这一行中,一个长度为3的滑动窗口,保存最大值。如果扫描到的元素grid[i][j]比队尾元素大,那么grid[i][j]很明显就更适合做最大值,q从队尾一直弹出直到【为空】【有一个元素比grid[i][j]大】

(2)当j >= 2以后,因为滑动窗口大小只有3,因此可能有【弹出队首】的操作了。队首的下标对应的元素grid[i][q.front()]是最大的,将其和结果对比,更大的话就写入。这个过程要遍历三行(ki-2i的过程),因此用max()函数取大。随后,因为滑动窗口大小只有3,若队首小于等于j-2,那么弹出。

完整代码:

class Solution {
public:vector<vector<int>> largestLocal(vector<vector<int>>& grid) {int N = grid.size();vector<vector<int>> ret(N-2, vector<int>(N-2, 0));   for (int i = 0; i < N; i++) {deque<int> q;for (int j = 0; j < N; j++) {while (!q.empty() && grid[i][j] >= grid[i][q.back()]) {q.pop_back();}q.push_back(j);if (j >= 2) {int val = grid[i][q.front()];for (int k = i-2; k <= i; k++) {if (k >= 0 && k < N-2) ret[k][j-2] = max(ret[k][j-2], val);}if (q.front() <= j-2) q.pop_front();}}}return ret;}
};
http://www.lryc.cn/news/69911.html

相关文章:

  • 工厂蓝牙定位技术的原理、应用场景、优势及潜在问题
  • Linux内核模块编程
  • 每日一练 | 网络工程师软考真题 Day8
  • springBoot如何【禁用Swagger】
  • ​数据库原理及应用上机(实验四 SQL连接查询)
  • linux上使用系统安装和Docker安装mysql的两种方式
  • 解决Mac下载官网JDK速度过慢的问题
  • 笔记本wifi与台式机、内网服务器共网、共享wifi详细教程
  • 纵观人类发展史,我发现了一个秘密!
  • HDFS的数据流
  • [230531] 托福听力真题|TPO67配套词汇|10:23-11:23
  • 每日学术速递5.21
  • 【SpringBoot】SpringBoot 纯后端项目如何自定义异常页面(Whitelabel Error Page)
  • Netty核心技术三--NIO编程
  • 机器人的运动范围:DFS
  • Rshiny编写ui中具有web依赖项的控件{该问题的具体阐述请看引言}
  • 1700页,卷S人的 软件测试《八股文》PDF手册,涨薪跳槽拿高薪就靠它了
  • bundle的常用命令
  • 一、数据字典介绍
  • 常见的SQL优化
  • Sonic新生态Sonic IDE体验
  • [VRTK4.0]安装VRTKv4Tilia软件包导入程序
  • SpringBoot开发实用篇2---与数据层技术有关的替换和整合
  • 科普ChatGPT
  • Spring MVC的核心类和注解
  • Java 创建一个大文件
  • 董小姐大意了
  • Java高并发核心编程—内置锁原理篇
  • opencv文字识别
  • bool、python集合