首页 > 其他分享 >LeetCode 3070. 元素和小于等于 k 的子矩阵的数目

LeetCode 3070. 元素和小于等于 k 的子矩阵的数目

时间:2024-07-22 09:26:13浏览次数:13  
标签:colsum int 复杂度 矩阵 3070 range grid presum LeetCode

3070. 元素和小于等于 k 的子矩阵的数目

给你一个下标从 0 开始的整数矩阵 grid 和一个整数 k

返回包含 grid 左上角元素、元素和小于或等于 k 的 子矩阵 的数目。

示例 1:

输入:grid = [[7,6,3],[6,6,1]], k = 18
输出:4
解释:如上图所示,只有 4 个子矩阵满足:包含 grid 的左上角元素,并且元素和小于或等于 18 。

示例 2:

输入:grid = [[7,2,9],[1,5,0],[2,6,6]], k = 20
输出:6
解释:如上图所示,只有 6 个子矩阵满足:包含 grid 的左上角元素,并且元素和小于或等于 20 。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= n, m <= 1000
  • 0 <= grid[i][j] <= 1000
  • 1 <= k <= 10^9

解法1:二维前缀和 + 双重循环

Java版:

class Solution {
    public int countSubmatrices(int[][] grid, int k) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] presum = new int[m + 1][n + 1];
        int ans = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                presum[i + 1][j + 1] = presum[i + 1][j] + presum[i][j + 1] - presum[i][j] + grid[i][j];
                if (presum[i + 1][j + 1] <= k) {
                    ans++;
                }
            }
        }
        return ans;
    } 
}

Python3版:

class Solution:
    def countSubmatrices(self, grid: List[List[int]], k: int) -> int:
        m = len(grid)
        n = len(grid[0])
        presum = [[0] * (n + 1) for _ in range(m + 1)]
        ans = 0
        for i in range(m):
            for j in range(n):
                presum[i + 1][j + 1] = presum[i + 1][j] + presum[i][j + 1] - presum[i][j] + grid[i][j]
                if presum[i + 1][j + 1] <= k:
                    ans += 1
        return ans
复杂度分析
  • 时间复杂度:O(mn),其中 m 和 n 分别为 grid 的行数和列数。
  • 空间复杂度:O(mn)。

解法2:维护每一列的元素和

遍历每一行,同时用一个长为 n 的数组 colsum 维护每一列的元素和。

遍历当前行时,一边更新 colsum[j],一边累加 colsum[j] 到变量 s 中。

如果 s≤k 则把答案加一,否则可以退出循环(因为矩阵元素都非负)。

Java版:

class Solution {
    public int countSubmatrices(int[][] grid, int k) {
        int m = grid.length;
        int n = grid[0].length;
        int[] colsum = new int[n];
        int ans = 0;
        for (int i = 0; i < m; i++) {
            int s = 0;
            for (int j = 0; j < n; j++) {
                colsum[j] += grid[i][j];
                s += colsum[j];
                if (s <= k) {
                    ans++;
                } else {
                    break;
                }
            }
        } 
        return ans;
    }
}

Python3版:

class Solution:
    def countSubmatrices(self, grid: List[List[int]], k: int) -> int:
        m = len(grid)
        n = len(grid[0])
        colsum = [0] * n
        ans = 0
        for i in range(m):
            s = 0
            for j in range(n):
                colsum[j] += grid[i][j]
                s += colsum[j]
                if s <= k:
                    ans += 1
                else:
                    break
        return ans
复杂度分析
  • 时间复杂度:O(mn),其中 m 和 n 分别为 grid 的行数和列数。
  • 空间复杂度:O(n)。

解法3:原地修改数组第一行

把每列元素和保存到 grid 的第一行,可以做到 O(1) 额外空间。

Java版:

class Solution {
    public int countSubmatrices(int[][] grid, int k) {
        int m = grid.length;
        int n = grid[0].length;
        int ans = 0;
        for (int i = 0; i < m; i++) {
            int s = 0;
            for (int j = 0; j < n; j++) {
                if (i > 0) {
                    grid[0][j] += grid[i][j];
                }
                s += grid[0][j];
                if (s <= k) {
                    ans++;
                } else {
                    break;
                }
            }
        } 
        return ans;
    }
}

Python3版:

class Solution:
    def countSubmatrices(self, grid: List[List[int]], k: int) -> int:
        m = len(grid)
        n = len(grid[0])
        ans = 0
        for i in range(m):
            s = 0
            for j in range(n):
                if i > 0:
                    grid[0][j] += grid[i][j]
                s += grid[0][j]
                if s <= k:
                    ans += 1
                else:
                    break
        return ans
复杂度分析
  • 时间复杂度:O(mn),其中 m 和 n 分别为 grid 的行数和列数。
  • 空间复杂度:O(1)。

标签:colsum,int,复杂度,矩阵,3070,range,grid,presum,LeetCode
From: https://blog.csdn.net/m0_56090828/article/details/140600011

相关文章

  • NumPy 连续矩阵乘法向量化
    我有一个NumPy数组ar形状(M,L,N,N)我想连续乘以L(N,N)矩阵(multiplied_ar[m]=ar[m,0,:,:]@ar[m,1,:,:]@...)以获得形状数组(M,N,N)是否有可能|||向量化以某种方式这样我就不必迭代和......
  • 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形
    /蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。/#include<stdio.h>#include<string.h>#defineMAX100voidfun(intn){intmatrix[MAX][MAX];//创建矩阵intnum=1;for(inti=0;i<n;i++){intx=0,y=i;while(y>=0)......
  • 一入循环深似海,代码随想录螺旋矩阵二刷
    代码随想录螺旋矩阵二刷leetcode59来看下螺旋矩阵。螺旋矩阵这道题确实很容易写着写着就绕进去了。首先读下题。给出正整数n,生成n*n的矩阵。我们来看其中一个用例,完成一个圈是需要四个循环去填充。但是四条边填充的时候要始终保持一样的规则,比如左闭右开的规则。那么转几圈呢......
  • leetcode位运算(1684. 统计一致字符串的数目)
    前言经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。后续开始专项练习。描述实现原理与步骤1.本题重点掌握相应字符bit位的编码规则2.bitArray和tempBitArray或之后还等于bitArray,说明bitArray包含tempBitArray代码实现classSolution{publ......
  • LeetCode题(66,69,35,88)--《c++》
     66.加一////Createdbywxj05on2024/7/20.////法一classSolution{public:vector<int>plusOne(vector<int>&digits){boolcarry=true;//进位标志for(inti=digits.size()-1;i>=0&&carry;--i){......
  • 蓝桥杯单片机学习(Day13 矩阵键盘 )
    现象:            按键S7、S11、S15、S19数码管显示00-03      按键S6、S10、S14、S18数码管显示04-07      按键S5、S9、S13、S17数码管显示08-11      按键S4、S8、S12、S16数码管显示12-15矩阵键盘介绍:    注......
  • Leetcode2427. 公因子的数目和Leetcode.728. 自除数
    Leetcode2427问题描述:给你两个正整数 a 和 b ,返回 a 和 b 的 公 因子的数目。如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的一个 公因子 。示例1:输入:a=12,b=6输出:4解释:12和6的公因子是1、2、3、6。示例2:输入:a=25,b=30......
  • leetcode 224 基本计算器
    题面就是实现一个字符串输入的加减法计算器(带括号),注意一元的减号是会出现的,且字符串中有空格思路就是使用两个栈,一个储存数字和计算结果,另外一个存运算符。基本步骤删去括号如果遇到')'就开始计算直到前一个左括号,运算顺序是先出栈的放在后面遇到的坑减号的优先级是高的,......
  • Python:对很高维的矩阵进行对角化?
    目前我正在研究一个涉及对角化矩阵以获得特征值和特征向量的问题。但现在我想将问题扩展到200,000x200,000的尺寸。我查找了如何将矩阵存储在numpy中,有人建议使用PyTables。看起来很有希望。但我想知道哪里有工具可以帮助对PyTables中的矩阵存储进行对角化。......
  • Leetcode 中的动态规划
    对于初学者来说,Leetcode中的动态规划可以做哪些问题?我想知道可以使用Leetcode中的动态规划来解决哪些问题,对于初学者来说很容易。我一直在LeetCode上练习问题,我注意到有些问题被专门标记为“动态编程”(DP)。我了解DP的基础知识,例如将问题分解为子问题并存储这些子问题的......