矩形累加和问题
矩形累加和是矩形类问题中最基础、也最常见的一类题型。如果我们要在二维矩阵中寻找累加和最大的子矩形,最直接的思路是枚举矩形的左上角和右下角,从而确定出一个子矩形并计算其元素之和。然而在这种朴素做法中,整体枚举复杂度高达 ,在实际题目中往往是 无法接受的 。为了降低复杂度,我们不再同时枚举四条边,而是只枚举矩形的上下边界,然后将这两条边之间的所有行压缩到一维数组中。这样一来,原本的二维矩形问题就被转化为一维区间问题。
在完成压缩之后,问题的本质便转变为 在一个一维数组中寻找满足题目条件的子区间 。此时,我们可以直接套用各种成熟的一维算法,例如前缀和、哈希表、双指针或最大子段和等经典方法,从而高效地求解矩形的左右边界。通过这种典型的 二维转一维 技巧,我们成功地将整体时间复杂度优化到了 ,这一复杂度在大多数矩形累加和相关问题中都足够高效,也构成了此类题目的 核心解题框架 。
子矩阵的最大和
Problem Statement
给定一个正整数、负整数和 组成的 矩阵,编写代码找出元素总和最大的子矩阵。
返回一个数组 [r1, c1, r2, c2] ,其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。
Constraints
Input
输入包含多行:
- 第一行包含两个整数 和 ,表示矩阵大小。
- 接下来 行包含 个整数,表示矩阵的一行。
Output
输出一个四元组表示答案矩阵的坐标。
Sample Input
2 2-1 00 -1Sample Output
0 1 0 1题目要点解析
均衡的矩形计数
Problem Statement
给定一个 的网格,每个单元格包含 # 或 . 。每个单元格中的符号信息由 个长度为 的字符串 给出,其中第 行第 列的单元格包含与 的第 个字符相同的符号。
找出满足以下所有条件的矩形区域的数量:
- 矩形区域内包含
#的单元格数量和包含.的单元格数量相等。
正式地,找出满足以下所有条件的整数四元组 的数量:
当从第 行到第 行以及从第 列到第 列提取网格的一部分时,提取部分中包含 # 的单元格数量和包含 . 的单元格数量相等。
你有 个测试用例。对每个测试用例找出答案。
Constraints
- 所有测试用例中 的总和不超过
- 是长度为 的由
#和.组成的字符串
Input
输入包含多个测试用例:
- 第一行包含一个整数 ,表示测试用例的数量。
对于每个测试用例:
- 第一行包含两个整数 和 ,表示网格的大小。
- 接下来的 行,每行包含一个长度为 的字符串。
Output
输出 行,第 行应该包含第 个测试用例的答案。
Sample Input
33 2###...6 6..#.....#..##.#.#..###..######.###..15 50.......................#...........###.###.###.###....................#..#..#..........#.#.#...#.#...................#...#####...#.....###.#.#.###.###..................#..##.##..#......#...#.#.#.....#...................#########.......###.###.###.###....................#.....#........................###........##......#.....#..#...#.####.####.##..##..#.........#......#.....#..#...#.#....#....##..##..#.........#......#.....#..#...#.#....#....##..##.....##...###..##..#.....#..#...#.#....#....#.#.##....#..#.#..#.#..#.#..##.#..#...#.####.####.#.#.##....#..#.#..#.####.#....##..#...#.#....#....#.#.##....#..#.#..#.#....#.....#..#...#.#....#....#..###..#.#..#.#..#.#..#.#....#.#.#...#.#....#....#..##.##...##...####.##...####..#..###..####.####.#..##Sample Output
4794032题目要点解析
完全子矩形问题
完全子矩形(元素全为 的矩形)是矩形类问题中第二类典型题型。与前一种矩形累加和问题相同,如果直接通过枚举子矩形的左上角和右下角来确定一个矩形,其时间复杂度会非常高,在数据规模稍大的情况下难以通过,因此我们需要找到新的枚举思路。不同于矩形累加和问题,完全子矩形问题不需要枚举矩形的上下边界,只需要单独 枚举矩形的底边 即可。以当前行为底边向上延伸,我们可以统计出每一列中连续为 的高度,从而将原本的二维矩形问题转化为一维柱状图问题。此时,问题等价于 「柱状图中最大的矩形」 这一经典题目。
由于「柱状图中最大的矩形」这一经典问题可以借助单调栈在 的时间内高效解决,当我们将矩阵中的每一行依次视为矩形的底边并进行处理时,整体时间复杂度便可以稳定地控制在 。在这一过程中,二维矩形问题被系统性地转化为一维柱状图问题,从而利用「柱状图中最大的矩形」这一成熟的算法工具。这种处理方式有效避免了对矩形四条边进行高维度暴力枚举,是解决完全子矩形问题时最为常见、也最为标准的思路。
柱状图最大矩形
Problem Statement
给定 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
Constraints
Input
输入包含两行:
- 第一行包含一个整数 ,表示数组长度。
- 第二行包含 个整数,表示数组中的各个元素。
Output
输出一个整数表示答案。
Sample Input 1
62 1 5 6 2 3Sample Output 1
10Sample Input 2
22 4Sample Output 2
4题目要点解析
最大的全一矩形
Problem Statement
给定一个由 和 组成的矩阵 matrix ,找出只包含 的最大矩形,并返回其面积。
注意:此题 matrix 输入格式为一维 字符串数组。
Constraints
- 仅包含 或
Input
输入包含多行:
- 第一行包含一个整数 ,表示矩阵的行数。
- 接下来 行包含一个字符串,表示矩阵的一行。
Output
输出一个整数表示答案。
Sample Input 1
410100101111111110010Sample Output 1
6题目要点解析
全一矩形的个数
Problem Statement
给你一个 m x n 的二进制矩阵 mat ,请你返回有多少个 子矩形 的元素全部都是 。
Constraints
- 仅包含 或
Input
输入包含多行:
- 第一行包含两个整数 和 ,表示矩阵大小。
- 接下来 行包含 个整数,表示矩阵的一行。
Output
输出一个整数表示答案。
Sample Input 1
3 31 0 11 1 01 1 0Sample Output 1
13Sample Input 2
3 40 1 1 00 1 1 11 1 1 0Sample Output 2
24题目要点解析
寻找高光的片段
Problem Statement
给定一个 的网格。每个单元格包含 . 或 # 。每个单元格中的符号信息由 个字符串 给出,其中第 行第 列的单元格包含与 的第 个字符相同的符号。有多少个最多包含 个单元格的矩形区域,使得所有单元格都包含 . ?
正式地,计算满足以下条件的整数四元组 的数量:
对于所有满足 且 的整数对 ,第 行第 列的单元格包含 . 。
Constraints
- 是整数。
- 是长度为 且由
.和#组成的字符串
Input
输入包含多行:
- 第一行包含三个整数 、 和 。
- 接下来的 行,每行包含一个长度为 的字符串。
Output
输出一个整数表示答案。
Sample Input 1
3 3 4#.......#Sample Output 1
19Sample Input 2
7 5 35...................................Sample Output 2
420Sample Input 3
10 9 25#.....#......#...........#.................#..#................#................#.#.....#.Sample Output 3
984