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

Leetcode 3359. 查找最大元素不超过 K 的有序子矩阵【Plus题】

1.题目基本信息

1.1.题目描述

给定一个大小为 m x n 的二维矩阵 grid。同时给定一个 非负整数 k。

返回满足下列条件的 grid 的子矩阵数量:

子矩阵中最大的元素 小于等于 k。

子矩阵的每一行都以 非递增 顺序排序。

矩阵的子矩阵 (x1, y1, x2, y2) 是通过选择所有满足 x1 <= x <= x2 且 y1 <= y <= y2 的 grid[x][y] 元素组成的矩阵。

1.2.题目地址

https://leetcode.cn/problems/find-sorted-submatrices-with-maximum-element-at-most-k/description/

2.解题方法

2.1.解题思路
单调栈

时间复杂度:O(n)

2.2.解题步骤
第一步,构建rows矩阵,rows[i][j]表示从mat[i][j]开始向左连续非严格递增且小于等于k的元素的个数(包括本身)

第二步,遍历每一列,列号记为j,再遍历每列中的每行,行号即为i

2.1.构建每一列的维护变量。total维护以(i,j)为右下角的全为1的子矩阵个数(如果该列的rows[i][j]非严格递增,则就等于前缀和);stack维护随着rows[i][j]严格递增的单调栈,存储单元形式为(rows[i][j],height*=rows矩阵中(i,j)上面连续不小于rows[i][j]的个数+1)

2.2.遍历每一列,更新total和stack,并将total更新到结果变量result中。total更新:如果rows[i][j]大于或等于单调栈栈顶的元素,则直接将rows[i][j]增加到total中,并入栈即可;如果小于,则将大的元素从栈中弹出,并从total中切除多余的子矩阵数(相当于切成一个非严格递增的rows[i][j]序列)

3.解题代码

Python代码

class Solution:def countSubmatrices(self, grid: List[List[int]], k: int) -> int:# 思路:单调栈# 参考:Leetcode 1504. 统计全 1 子矩形mat = gridm, n = len(mat), len(mat[0])# 第一步,构建rows矩阵,rows[i][j]表示从mat[i][j]开始向左连续非严格递增且小于等于l的元素的个数(包括本身)rows = [[0] * n for _ in range(m)]for i in range(m):for j in range(n):if mat[i][j] <= k:if j > 0 and mat[i][j] <= mat[i][j - 1]:rows[i][j] = rows[i][j - 1] + 1else:rows[i][j] = 1# 第二步,遍历每一列,列号记为j,再遍历每列中的每行,行号即为iresult = 0for j in range(n):# 2.1.构建每一列的维护变量。total维护以(i,j)为右下角的全为1的子矩阵个数(如果该列的rows[i][j]非严格递增,则就等于前缀和);stack维护随着rows[i][j]严格递增的单调栈,存储单元形式为(rows[i][j],height*=rows矩阵中(i,j)上面连续不小于rows[i][j]的个数+1)total = 0stack = []# 2.2.遍历每一列,更新total和stack,并将total更新到结果变量result中。total更新:如果rows[i][j]大于或等于单调栈栈顶的元素,则直接将rows[i][j]增加到total中,并入栈即可;如果小于,则将大的元素从栈中弹出,并从total中切除多余的子矩阵数(相当于切成一个非严格递增的rows[i][j]序列)for i in range(m):height = 1while stack and stack[-1][0] >= rows[i][j]:preRow, preHeight = stack.pop()height += preHeighttotal -= (preRow - rows[i][j]) * preHeighttotal += rows[i][j]stack.append([rows[i][j], height])result += totalreturn result

4.执行结果

在这里插入图片描述

相关文章:

  • dumpsys--音频服务状态信息
  • GUI GUIDIER8.2版本兼容8.3.1版本
  • SLAM | 激光SLAM中的退化问题
  • Linux系统中的Perf总结
  • LabVIEW 开发:永不落幕的求知之旅​
  • 【C++初阶】--- list容器功能模拟实现
  • 【AI】以Llama模型为例学习如何进行LLM模型微调
  • HttpSessionBindingListener 的用法笔记250417
  • 【LLM Prompt】CoT vs.ToT
  • Unity编辑器扩展之项目资源查找工具
  • std::unordered_map(C++)
  • 量子计算:开启未来科技之门的钥匙
  • 【网络】IP层的重要知识
  • C++笔记-list
  • yolov8复现
  • Redis List 的详细介绍
  • Socket通信的基本概述
  • 视线估计的相关研究
  • PHP 文件上传
  • prism
  • 精品消费“精”在哪?多在体验上下功夫
  • 临港新片区将新设5亿元启航基金:专门投向在临港发展的种子期、初创型企业
  • 龚正会见哥伦比亚总统佩特罗
  • 视频丨中国海警成功救助8名外籍遇险渔民,韩方向中方致谢
  • “一码难求”的Manus开放注册但价格不菲,智能体距离“实用”还有多远
  • 外交部:正确认识和对待历史是检验日本能否恪守和平发展承诺的重要标准