-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProblem_17.23_findSquare.cc
65 lines (63 loc) · 2.01 KB
/
Problem_17.23_findSquare.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <vector>
using namespace std;
// 扩展题 最大正方形 Problem_0221_maximalSquare.cc
// @sa https://leetcode.cn/problems/maximal-square/
class Solution
{
public:
vector<int> findSquare(vector<vector<int>>& matrix)
{
int n = matrix.size();
// left[i][j]表示坐标(i-1, j-1)及左边最大连续0的数量
vector<vector<int>> left(n + 1, vector<int>(n + 1));
// up[i][j]表示坐标(i-1, j-1)及上边最大连续0的数量
vector<vector<int>> up(n + 1, vector<int>(n + 1));
int r = 0;
int c = 0;
int size = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (matrix[i - 1][j - 1] == 0)
{
// 检测上侧边 (i-border+1, j)
// --------------
// 检 | |
// 测 | |
// 左 | | border
// 侧 | |
// 边 | |
// | |
// (i, j-border+1) --------------
// border (i,j)
left[i][j] = left[i][j - 1] + 1;
up[i][j] = up[i - 1][j] + 1;
int border = std::min(left[i][j], up[i][j]);
while (left[i - border + 1][j] < border || up[i][j - border + 1] < border)
{
border--;
}
// 由于计算的顺序是 i 和 j递增的,所以如果有多个方阵大小一样
// 那么返回的下标一定满足左上角行下标最小,
// 当存在左上角行下标并列最小的情况时时满足左上角列下标最小
if (border > size)
{
// 由于坐标是从(0,0)开始,所以需要 -1
r = i - border;
c = j - border;
size = border;
}
}
}
}
if (size > 0)
{
return {r, c, size};
}
else
{
return {};
}
}
};