LeetCode 3070. 元素和小于等于 k 的子矩阵数目
LeetCode 3070. 元素和小于等于 k 的子矩阵数目题目描述给你一个大小为m x n的整数矩阵grid和一个整数k。你需要找出grid中所有以左上角(0,0)为起始点的子矩阵并统计这些子矩阵中元素和不超过k的个数。注意子矩阵必须包含(0,0)这个格子即子矩阵的左上角固定为原点右下角可以是任意坐标(i,j)0 i m, 0 j n。思路分析本题的暴力做法是枚举所有可能的子矩阵并计算其和但时间复杂度会达到 O(m²n²)不可取。由于子矩阵的左上角固定我们可以利用二维前缀和来快速得到任意从(0,0)到(i,j)的子矩阵的和。二维前缀和定义s[i1][j1]表示原矩阵中从(0,0)到(i,j)的子矩阵的元素和。这样s[i][j]就对应了以(i-1,j-1)为右下角的子矩阵的和左上角为(0,0)。前缀和的递推公式容斥原理s[i1][j1] s[i1][j] s[i][j1] - s[i][j] grid[i][j]其中s[0][*]和s[*][0]均为 0方便边界处理。统计答案构建完前缀和数组s后我们只需要遍历所有可能的右下角坐标(i,j)i从 1 到 mj从 1 到 n检查s[i][j] k是否成立如果成立则答案加一。代码实现classSolution{public:intcountSubmatrices(vectorvectorintgrid,intk){intmgrid.size(),ngrid[0].size();// 二维前缀和数组大小为 (m1) x (n1)vectorvectorints(m1,vectorint(n1,0));// 构建前缀和for(inti0;im;i){for(intj0;jn;j){s[i1][j1]s[i1][j]s[i][j1]-s[i][j]grid[i][j];}}intans0;// 枚举右下角for(inti1;im;i){for(intj1;jn;j){if(s[i][j]k)ans;}}returnans;}};复杂度分析时间复杂度O(m × n)。构建前缀和需要遍历所有格子统计答案也需要遍历所有可能的右下角因此总时间复杂度为 O(mn)。空间复杂度O(m × n)用于存储二维前缀和数组。总结本题的核心是二维前缀和的应用。由于子矩阵的左上角固定为原点前缀和数组可以直接对应每个可能子矩阵的和从而将统计过程简化为一次遍历。掌握二维前缀和可以高效解决类似矩阵区域和的问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2423991.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!