📅  最后修改于: 2023-12-03 15:40:38.961000             🧑  作者: Mango
题目描述
给定一个 $n\times m$ 的矩阵,矩阵中元素为非负整数。请设计一个算法,找到矩阵中最大的正方形 $S$,使得 $S$ 内所有子矩阵中元素之和不超过给定的整数 $K$。
算法思路
本题可以借鉴LeetCode第363题的做法,采用二分答案+前缀和+子矩阵和的方式解决。
具体思路如下:
- 设矩阵大小为 $n\times m$,使用前缀和数组 $sum$ 记录 $[1,1]$ 到 $[i,j]$ 子矩阵中元素之和,其中 $1\leq i\leq n$,$1\leq j\leq m$。
- 以 $i,j$ 为右下角顶点,以 $k$ 为边长的正方形的元素之和为 $S=\sum\limits_{p=i-k+1}^{i}\sum\limits_{q=j-k+1}^{j}a_{p,q}$,其中 $1\leq p\leq i$,$1\leq q\leq j$。
- 对于矩阵中所有正方形,可按照 $S$ 的大小进行排序。
- 假设当前要求的正方形边长为 $x$,需要找到一个最大的 $x$,满足所有 $S$ 不超过 $K$。
- 因为所有正方形按照 $S$ 的大小排列,因此可以使用二分查找,找到最大的 $x$,使得 $S\leq K$。
- 在查找的过程中,判断正方形与 $K$ 的关系,可以使用“子矩阵和”思想(LeetCode题解中也有详细讲解)。
- 最终返回找到的最大边长 $x$。
复杂度分析
本题解采用二分答案的方式,因此时间复杂度为 $O(n^3\log n)$,其中 $n=\max(m,n)$(实际上,$n$ 要取 $\min(m,n)$ 才对,这里取 $\max(m,n)$ 只是为了方便讲解)。
空间复杂度为 $O(n^2)$,主要是前缀和数组 $sum$ 的占用空间。
代码实现
下面给出题解的代码实现: