LeetCode 1292.元素和小于等于阈值的正方形的最大边长:二维前缀和(无需二分)+抽象速懂的描述

【LetMeFly】1292.元素和小于等于阈值的正方形的最大边长:二维前缀和(无需二分)+抽象速懂的描述

力扣题目链接:https://leetcode.cn/problems/maximum-side-length-of-a-square-with-sum-less-than-or-equal-to-threshold/

给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold

请你返回元素总和小于或等于阈值的正方形区域的最大边长;如果没有这样的正方形区域,则返回 0

示例 1:

复制代码
输入:mat = [[1,1,3,2,4,3,2],[1,1,3,2,4,3,2],[1,1,3,2,4,3,2]], threshold = 4
输出:2
解释:总和小于或等于 4 的正方形的最大边长为 2,如图所示。

示例 2:

复制代码
输入:mat = [[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2]], threshold = 1
输出:0

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 300
  • 0 <= mat[i][j] <= 104
  • 0 <= threshold <= 105

解题方法:前缀和

二维矩阵的二维前缀和可以快速计算出某个子矩阵的元素和。

复制代码
AB
CD

其中prefix[D]代表从左上角到D这个矩阵的元素和,计算方法为D+B+C-A

复制代码
ABC
DEF
GHI

那么想计算EFHI这个子矩阵的元素和就只需要prefix[I]-prefix[C]-prefix[G]+prefix[A]

二层循环枚举矩阵左上角顶点,使用一个变量ans作为答案合法边长并且只增不减 ,那么二层循环时间复杂度 O ( m n ) O(mn) O(mn),内层ans总时间复杂度不会超过 O min ⁡ ( m , n ) O\min(m,n) Omin(m,n)。

  • 时间复杂度 O ( m n ) O(mn) O(mn)
  • 空间复杂度 O ( N log ⁡ N ) O(N\log N) O(NlogN)

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-01-19 21:55:16
 */
class Solution {
public:
    int maxSideLength(vector<vector<int>>& mat, int threshold) {
        int n = mat.size(), m = mat[0].size();
        vector<vector<int>> prefix(n + 1, vector<int>(m + 1));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                prefix[i + 1][j + 1] = mat[i][j] - prefix[i][j] + prefix[i][j + 1] + prefix[i + 1][j];
            }
        }

        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                while (i + ans < n && j + ans < m && prefix[i + ans + 1][j + ans + 1] - prefix[i + ans + 1][j] - prefix[i][j + ans + 1] + prefix[i][j] <= threshold) {
                    ans++;
                }
            }
        }
        return ans;
    }
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
tankeven2 小时前
动态规划专题(03):区间动态规划从原理到实践(未完待续)
c++·算法·动态规划
田梓燊3 小时前
2026/4/11 leetcode 3741
数据结构·算法·leetcode
斯内科3 小时前
FFT快速傅里叶变换
算法·fft
2301_822703203 小时前
开源鸿蒙跨平台Flutter开发:幼儿疫苗全生命周期追踪系统:基于 Flutter 的免疫接种档案与状态机设计
算法·flutter·华为·开源·harmonyos·鸿蒙
贵慜_Derek3 小时前
Managed Agents 里,Harness 到底升级了什么?
人工智能·算法·架构
2301_822703204 小时前
鸿蒙flutter三方库实战——教育与学习平台:Flutter Markdown
学习·算法·flutter·华为·harmonyos·鸿蒙
Jia ming4 小时前
C语言实现日期天数计算
c语言·开发语言·算法
无限进步_5 小时前
【C++&string】大数相乘算法详解:从字符串加法到乘法实现
java·开发语言·c++·git·算法·github·visual studio
苏纪云5 小时前
蓝桥杯考前突击
c++·算法·蓝桥杯
W23035765735 小时前
经典算法详解:最长公共子序列 (LCS) —— 从暴力递归到动态规划完整实现
算法·动态规划·最长子序列