Skip to content

Commit 952eb6b

Browse files
committed
feat: add solutions to lc problem: No.1504
No.1504.Count Submatrices With All Ones
1 parent 5c02ccf commit 952eb6b

File tree

6 files changed

+320
-2
lines changed

6 files changed

+320
-2
lines changed

solution/1500-1599/1504.Count Submatrices With All Ones/README.md

+115-1
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,136 @@
5858

5959
<!-- 这里可写通用的实现逻辑 -->
6060

61+
**方法一:枚举 + 前缀和**
62+
63+
我们可以枚举矩阵的右下角 $(i, j)$,然后向上枚举矩阵的第一行 $k$,那么每一行以 $(i, j)$ 为右下角的矩阵的宽度就是 $\min_{k \leq i} \textit{g}[k][j]$,其中 $\textit{g}[k][j]$ 表示第 $k$ 行以 $(k, j)$ 为右下角的矩阵的宽度。
64+
65+
因此,我们可以预处理得到二维数组 $g[i][j]$,其中 $g[i][j]$ 表示第 $i$ 行中,从第 $j$ 列向左连续的 $1$ 的个数。
66+
67+
时间复杂度 $O(m^2 \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
68+
6169
<!-- tabs:start -->
6270

6371
### **Python3**
6472

6573
<!-- 这里可写当前语言的特殊实现逻辑 -->
6674

6775
```python
68-
76+
class Solution:
77+
def numSubmat(self, mat: List[List[int]]) -> int:
78+
m, n = len(mat), len(mat[0])
79+
g = [[0] * n for _ in range(m)]
80+
for i in range(m):
81+
for j in range(n):
82+
if mat[i][j]:
83+
g[i][j] = 1 if j == 0 else 1 + g[i][j - 1]
84+
ans = 0
85+
for i in range(m):
86+
for j in range(n):
87+
col = inf
88+
for k in range(i, -1, -1):
89+
col = min(col, g[k][j])
90+
ans += col
91+
return ans
6992
```
7093

7194
### **Java**
7295

7396
<!-- 这里可写当前语言的特殊实现逻辑 -->
7497

7598
```java
99+
class Solution {
100+
public int numSubmat(int[][] mat) {
101+
int m = mat.length, n = mat[0].length;
102+
int[][] g = new int[m][n];
103+
for (int i = 0; i < m; ++i) {
104+
for (int j = 0; j < n; ++j) {
105+
if (mat[i][j] == 1) {
106+
g[i][j] = j == 0 ? 1 : 1 + g[i][j - 1];
107+
}
108+
}
109+
}
110+
int ans = 0;
111+
for (int i = 0; i < m; ++i) {
112+
for (int j = 0; j < n; ++j) {
113+
int col = 1 << 30;
114+
for (int k = i; k >= 0 && col > 0; --k) {
115+
col = Math.min(col, g[k][j]);
116+
ans += col;
117+
}
118+
}
119+
}
120+
return ans;
121+
}
122+
}
123+
```
124+
125+
### **C++**
126+
127+
```cpp
128+
class Solution {
129+
public:
130+
int numSubmat(vector<vector<int>>& mat) {
131+
int m = mat.size(), n = mat[0].size();
132+
vector<vector<int>> g(m, vector<int>(n));
133+
for (int i = 0; i < m; ++i) {
134+
for (int j = 0; j < n; ++j) {
135+
if (mat[i][j] == 1) {
136+
g[i][j] = j == 0 ? 1 : 1 + g[i][j - 1];
137+
}
138+
}
139+
}
140+
int ans = 0;
141+
for (int i = 0; i < m; ++i) {
142+
for (int j = 0; j < n; ++j) {
143+
int col = 1 << 30;
144+
for (int k = i; k >= 0 && col > 0; --k) {
145+
col = min(col, g[k][j]);
146+
ans += col;
147+
}
148+
}
149+
}
150+
return ans;
151+
}
152+
};
153+
```
76154
155+
### **Go**
156+
157+
```go
158+
func numSubmat(mat [][]int) (ans int) {
159+
m, n := len(mat), len(mat[0])
160+
g := make([][]int, m)
161+
for i := range g {
162+
g[i] = make([]int, n)
163+
for j := range g[i] {
164+
if mat[i][j] == 1 {
165+
if j == 0 {
166+
g[i][j] = 1
167+
} else {
168+
g[i][j] = 1 + g[i][j-1]
169+
}
170+
}
171+
}
172+
}
173+
for i := range g {
174+
for j := range g[i] {
175+
col := 1 << 30
176+
for k := i; k >= 0 && col > 0; k-- {
177+
col = min(col, g[k][j])
178+
ans += col
179+
}
180+
}
181+
}
182+
return
183+
}
184+
185+
func min(a, b int) int {
186+
if a < b {
187+
return a
188+
}
189+
return b
190+
}
77191
```
78192

79193
### **...**

solution/1500-1599/1504.Count Submatrices With All Ones/README_EN.md

+107-1
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,119 @@ Total number of rectangles = 8 + 5 + 2 + 4 + 2 + 2 + 1 = 24.
5252
### **Python3**
5353

5454
```python
55-
55+
class Solution:
56+
def numSubmat(self, mat: List[List[int]]) -> int:
57+
m, n = len(mat), len(mat[0])
58+
g = [[0] * n for _ in range(m)]
59+
for i in range(m):
60+
for j in range(n):
61+
if mat[i][j]:
62+
g[i][j] = 1 if j == 0 else 1 + g[i][j - 1]
63+
ans = 0
64+
for i in range(m):
65+
for j in range(n):
66+
col = inf
67+
for k in range(i, -1, -1):
68+
col = min(col, g[k][j])
69+
ans += col
70+
return ans
5671
```
5772

5873
### **Java**
5974

6075
```java
76+
class Solution {
77+
public int numSubmat(int[][] mat) {
78+
int m = mat.length, n = mat[0].length;
79+
int[][] g = new int[m][n];
80+
for (int i = 0; i < m; ++i) {
81+
for (int j = 0; j < n; ++j) {
82+
if (mat[i][j] == 1) {
83+
g[i][j] = j == 0 ? 1 : 1 + g[i][j - 1];
84+
}
85+
}
86+
}
87+
int ans = 0;
88+
for (int i = 0; i < m; ++i) {
89+
for (int j = 0; j < n; ++j) {
90+
int col = 1 << 30;
91+
for (int k = i; k >= 0 && col > 0; --k) {
92+
col = Math.min(col, g[k][j]);
93+
ans += col;
94+
}
95+
}
96+
}
97+
return ans;
98+
}
99+
}
100+
```
101+
102+
### **C++**
103+
104+
```cpp
105+
class Solution {
106+
public:
107+
int numSubmat(vector<vector<int>>& mat) {
108+
int m = mat.size(), n = mat[0].size();
109+
vector<vector<int>> g(m, vector<int>(n));
110+
for (int i = 0; i < m; ++i) {
111+
for (int j = 0; j < n; ++j) {
112+
if (mat[i][j] == 1) {
113+
g[i][j] = j == 0 ? 1 : 1 + g[i][j - 1];
114+
}
115+
}
116+
}
117+
int ans = 0;
118+
for (int i = 0; i < m; ++i) {
119+
for (int j = 0; j < n; ++j) {
120+
int col = 1 << 30;
121+
for (int k = i; k >= 0 && col > 0; --k) {
122+
col = min(col, g[k][j]);
123+
ans += col;
124+
}
125+
}
126+
}
127+
return ans;
128+
}
129+
};
130+
```
61131
132+
### **Go**
133+
134+
```go
135+
func numSubmat(mat [][]int) (ans int) {
136+
m, n := len(mat), len(mat[0])
137+
g := make([][]int, m)
138+
for i := range g {
139+
g[i] = make([]int, n)
140+
for j := range g[i] {
141+
if mat[i][j] == 1 {
142+
if j == 0 {
143+
g[i][j] = 1
144+
} else {
145+
g[i][j] = 1 + g[i][j-1]
146+
}
147+
}
148+
}
149+
}
150+
for i := range g {
151+
for j := range g[i] {
152+
col := 1 << 30
153+
for k := i; k >= 0 && col > 0; k-- {
154+
col = min(col, g[k][j])
155+
ans += col
156+
}
157+
}
158+
}
159+
return
160+
}
161+
162+
func min(a, b int) int {
163+
if a < b {
164+
return a
165+
}
166+
return b
167+
}
62168
```
63169

64170
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
int numSubmat(vector<vector<int>>& mat) {
4+
int m = mat.size(), n = mat[0].size();
5+
vector<vector<int>> g(m, vector<int>(n));
6+
for (int i = 0; i < m; ++i) {
7+
for (int j = 0; j < n; ++j) {
8+
if (mat[i][j] == 1) {
9+
g[i][j] = j == 0 ? 1 : 1 + g[i][j - 1];
10+
}
11+
}
12+
}
13+
int ans = 0;
14+
for (int i = 0; i < m; ++i) {
15+
for (int j = 0; j < n; ++j) {
16+
int col = 1 << 30;
17+
for (int k = i; k >= 0 && col > 0; --k) {
18+
col = min(col, g[k][j]);
19+
ans += col;
20+
}
21+
}
22+
}
23+
return ans;
24+
}
25+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
func numSubmat(mat [][]int) (ans int) {
2+
m, n := len(mat), len(mat[0])
3+
g := make([][]int, m)
4+
for i := range g {
5+
g[i] = make([]int, n)
6+
for j := range g[i] {
7+
if mat[i][j] == 1 {
8+
if j == 0 {
9+
g[i][j] = 1
10+
} else {
11+
g[i][j] = 1 + g[i][j-1]
12+
}
13+
}
14+
}
15+
}
16+
for i := range g {
17+
for j := range g[i] {
18+
col := 1 << 30
19+
for k := i; k >= 0 && col > 0; k-- {
20+
col = min(col, g[k][j])
21+
ans += col
22+
}
23+
}
24+
}
25+
return
26+
}
27+
28+
func min(a, b int) int {
29+
if a < b {
30+
return a
31+
}
32+
return b
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class Solution {
2+
public int numSubmat(int[][] mat) {
3+
int m = mat.length, n = mat[0].length;
4+
int[][] g = new int[m][n];
5+
for (int i = 0; i < m; ++i) {
6+
for (int j = 0; j < n; ++j) {
7+
if (mat[i][j] == 1) {
8+
g[i][j] = j == 0 ? 1 : 1 + g[i][j - 1];
9+
}
10+
}
11+
}
12+
int ans = 0;
13+
for (int i = 0; i < m; ++i) {
14+
for (int j = 0; j < n; ++j) {
15+
int col = 1 << 30;
16+
for (int k = i; k >= 0 && col > 0; --k) {
17+
col = Math.min(col, g[k][j]);
18+
ans += col;
19+
}
20+
}
21+
}
22+
return ans;
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def numSubmat(self, mat: List[List[int]]) -> int:
3+
m, n = len(mat), len(mat[0])
4+
g = [[0] * n for _ in range(m)]
5+
for i in range(m):
6+
for j in range(n):
7+
if mat[i][j]:
8+
g[i][j] = 1 if j == 0 else 1 + g[i][j - 1]
9+
ans = 0
10+
for i in range(m):
11+
for j in range(n):
12+
col = inf
13+
for k in range(i, -1, -1):
14+
col = min(col, g[k][j])
15+
ans += col
16+
return ans

0 commit comments

Comments
 (0)