Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 95114cb

Browse files
feat: add solutions to lc problem: No.1277 (#4657)
No.1277.Count Square Submatrices with All Ones
1 parent e2331ba commit 95114cb

File tree

13 files changed

+527
-73
lines changed

13 files changed

+527
-73
lines changed

‎solution/1200-1299/1277.Count Square Submatrices with All Ones/README.md

Lines changed: 110 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ tags:
3333
  [0,1,1,1]
3434
]
3535
<strong>输出:</strong>15
36-
<strong>解释:</strong>
36+
<strong>解释:</strong>
3737
边长为 1 的正方形有 <strong>10</strong> 个。
3838
边长为 2 的正方形有 <strong>4</strong> 个。
3939
边长为 3 的正方形有 <strong>1</strong> 个。
@@ -42,15 +42,15 @@ tags:
4242

4343
<p><strong>示例 2:</strong></p>
4444

45-
<pre><strong>输入:</strong>matrix =
45+
<pre><strong>输入:</strong>matrix =
4646
[
4747
[1,0,1],
4848
[1,1,0],
4949
[1,1,0]
5050
]
5151
<strong>输出:</strong>7
5252
<strong>解释:</strong>
53-
边长为 1 的正方形有 <strong>6</strong> 个。
53+
边长为 1 的正方形有 <strong>6</strong> 个。
5454
边长为 2 的正方形有 <strong>1</strong> 个。
5555
正方形的总数 = 6 + 1 = <strong>7</strong>.
5656
</pre>
@@ -71,7 +71,20 @@ tags:
7171

7272
<!-- solution:start -->
7373

74-
### 方法一
74+
### 方法一:动态规划
75+
76+
我们定义 $f[i][j]$ 为以 $(i,j)$ 为右下角的正方形子矩阵的边长,初始时 $f[i][j] = 0,ドル答案为 $\sum_{i,j} f[i][j]$。
77+
78+
考虑 $f[i][j]$ 如何进行状态转移。
79+
80+
- 当 $\text{matrix}[i][j] = 0$ 时,有 $f[i][j] = 0$。
81+
- 当 $\text{matrix}[i][j] = 1$ 时,状态 $f[i][j]$ 的值取决于其上、左、左上三个位置的值:
82+
- 如果 $i = 0$ 或 $j = 0,ドル则 $f[i][j] = 1$。
83+
- 否则 $f[i][j] = \min(f[i-1][j-1], f[i-1][j], f[i][j-1]) + 1$。
84+
85+
答案为 $\sum_{i,j} f[i][j]$。
86+
87+
时间复杂度 $O(m \times n),ドル空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数。
7588

7689
<!-- tabs:start -->
7790

@@ -133,11 +146,14 @@ public:
133146
vector<vector<int>> f(m, vector<int>(n));
134147
for (int i = 0; i < m; ++i) {
135148
for (int j = 0; j < n; ++j) {
136-
if (matrix[i][j] == 0) continue;
137-
if (i == 0 || j == 0)
149+
if (matrix[i][j] == 0) {
150+
continue;
151+
}
152+
if (i == 0 || j == 0) {
138153
f[i][j] = 1;
139-
else
154+
} else {
140155
f[i][j] = min(f[i - 1][j - 1], min(f[i - 1][j], f[i][j - 1])) + 1;
156+
}
141157
ans += f[i][j];
142158
}
143159
}
@@ -176,45 +192,115 @@ func countSquares(matrix [][]int) int {
176192

177193
```ts
178194
function countSquares(matrix: number[][]): number {
179-
const [m, n] = [matrix.length, matrix[0].length];
180-
const f = Array.from({ length: m }, () => Array(n));
181-
const dfs = (i: number, j: number): number => {
182-
if (i === m || j === n || !matrix[i][j]) return 0;
183-
f[i][j] ??= 1 + Math.min(dfs(i + 1, j), dfs(i, j + 1), dfs(i + 1, j + 1));
184-
return f[i][j];
185-
};
195+
const m = matrix.length;
196+
const n = matrix[0].length;
197+
const f: number[][] = Array.from({ length: m }, () => Array(n).fill(0));
186198
let ans = 0;
187199

188200
for (let i = 0; i < m; i++) {
189201
for (let j = 0; j < n; j++) {
190-
ans += dfs(i, j);
202+
if (matrix[i][j] === 0) {
203+
continue;
204+
}
205+
if (i === 0 || j === 0) {
206+
f[i][j] = 1;
207+
} else {
208+
f[i][j] = Math.min(f[i - 1][j - 1], Math.min(f[i - 1][j], f[i][j - 1])) + 1;
209+
}
210+
ans += f[i][j];
191211
}
192212
}
193213

194214
return ans;
195215
}
196216
```
197217

218+
#### Rust
219+
220+
```rust
221+
impl Solution {
222+
pub fn count_squares(matrix: Vec<Vec<i32>>) -> i32 {
223+
let m = matrix.len();
224+
let n = matrix[0].len();
225+
let mut f = vec![vec![0; n]; m];
226+
let mut ans = 0;
227+
228+
for i in 0..m {
229+
for j in 0..n {
230+
if matrix[i][j] == 0 {
231+
continue;
232+
}
233+
if i == 0 || j == 0 {
234+
f[i][j] = 1;
235+
} else {
236+
f[i][j] = std::cmp::min(f[i - 1][j - 1], std::cmp::min(f[i - 1][j], f[i][j - 1])) + 1;
237+
}
238+
ans += f[i][j];
239+
}
240+
}
241+
242+
ans
243+
}
244+
}
245+
```
246+
198247
#### JavaScript
199248

200249
```js
201-
functioncountSquares(matrix) {
202-
const [m, n] = [matrix.length, matrix[0].length];
203-
constf=Array.from({ length: m }, () =>Array(n));
204-
constdfs= (i, j) => {
205-
if (i === m || j === n ||!matrix[i][j]) return0;
206-
f[i][j] ??=1+Math.min(dfs(i +1, j), dfs(i, j +1), dfs(i +1, j +1));
207-
return f[i][j];
208-
};
250+
/**
251+
* @param{number[][]} matrix
252+
* @return{number}
253+
*/
254+
varcountSquares=function (matrix) {
255+
constm=matrix.length;
256+
constn= matrix[0].length;
257+
constf=Array.from({ length: m }, () =>Array(n).fill(0));
209258
let ans = 0;
210259

211260
for (let i = 0; i < m; i++) {
212261
for (let j = 0; j < n; j++) {
213-
ans += dfs(i, j);
262+
if (matrix[i][j] === 0) {
263+
continue;
264+
}
265+
if (i === 0 || j === 0) {
266+
f[i][j] = 1;
267+
} else {
268+
f[i][j] = Math.min(f[i - 1][j - 1], Math.min(f[i - 1][j], f[i][j - 1])) + 1;
269+
}
270+
ans += f[i][j];
214271
}
215272
}
216273

217274
return ans;
275+
};
276+
```
277+
278+
#### C#
279+
280+
```cs
281+
public class Solution {
282+
public int CountSquares(int[][] matrix) {
283+
int m = matrix.Length;
284+
int n = matrix[0].Length;
285+
int[,] f = new int[m, n];
286+
int ans = 0;
287+
288+
for (int i = 0; i < m; i++) {
289+
for (int j = 0; j < n; j++) {
290+
if (matrix[i][j] == 0) {
291+
continue;
292+
}
293+
if (i == 0 || j == 0) {
294+
f[i, j] = 1;
295+
} else {
296+
f[i, j] = Math.Min(f[i - 1, j - 1], Math.Min(f[i - 1, j], f[i, j - 1])) + 1;
297+
}
298+
ans += f[i, j];
299+
}
300+
}
301+
302+
return ans;
303+
}
218304
}
219305
```
220306

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /