Skip to content

Commit f7e2aed

Browse files
committed
2 parents 0b63f54 + eea8155 commit f7e2aed

6 files changed

Lines changed: 200 additions & 0 deletions

File tree

hello.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Hello Git Collaboration
2+
这是测试git协作流程的示例文件,提交PR后审核通过即可合并到main分支。
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// 二维前缀和
2+
#include <vector>
3+
4+
using namespace std;
5+
6+
class Solution {
7+
public:
8+
int countSubmatrices(vector<vector<int>>& grid, int k) {
9+
int m = grid.size(),n = grid[0].size();
10+
int ans = 0;
11+
vector<vector<int>> sum(m+1,vector<int>(n+1));
12+
13+
for(int i = 0;i<m;++i){
14+
for(int j = 0;j<n;++j){
15+
sum[i+1][j+1] = sum[i][j+1] + sum[i+1][j] - sum[i][j] + grid[i][j];
16+
if(sum[i+1][j+1] >k)break;
17+
ans+=1;
18+
}
19+
}
20+
return ans;
21+
}
22+
};
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// 原地二维前缀和
2+
#include <vector>
3+
4+
using namespace std;
5+
6+
class Solution {
7+
public:
8+
int countSubmatrices(vector<vector<int>> &grid, int k) {
9+
int m = grid.size(), n = grid[0].size();
10+
int ans = 0;
11+
12+
for (int i = 0; i < m; ++i) {
13+
for (int j = 0; j < n; ++j) {
14+
if(i > 0)grid[i][j] += grid[i-1][j];
15+
if(j > 0)grid[i][j] += grid[i][j-1];
16+
if(i >0 && j > 0) grid[i][j] -= grid[i-1][j-1];
17+
18+
if(grid[i][j] >k) break;
19+
++ans;
20+
}
21+
}
22+
return ans;
23+
}
24+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// 维护每列元素和
2+
#include <vector>
3+
4+
using namespace std;
5+
6+
class Solution {
7+
public:
8+
int countSubmatrices(vector<vector<int>> &grid, int k) {
9+
int n = grid[0].size();
10+
vector<int> col_sum(n);
11+
int ans = 0;
12+
for(auto &row:grid){
13+
int s = 0;
14+
for(int j = 0;j<n;++j){
15+
col_sum[j] += row[j];
16+
s += col_sum[j];
17+
if(s > k)break;
18+
++ans;
19+
}
20+
}
21+
return ans;
22+
}
23+
};
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# 3070. 元素和小于等于 k 的子矩阵的数目
2+
3+
## 问题
4+
5+
统计所有元素和 ≤ k 的**左上角为 (0,0)** 的子矩阵个数。
6+
7+
---
8+
9+
## 方法一:二维前缀和
10+
11+
### 思路
12+
13+
-`sum[i+1][j+1]` 表示 grid 中 `(0,0)``(i,j)` 的元素和
14+
- 转移公式:`sum[i+1][j+1] = sum[i][j+1] + sum[i+1][j] - sum[i][j] + grid[i][j]`
15+
- 加上方块 + 加左方块 - 减重叠部分 + 加当前元素
16+
17+
```cpp
18+
// 二维前缀和
19+
class Solution {
20+
public:
21+
int countSubmatrices(vector<vector<int>>& grid, int k) {
22+
int m = grid.size(), n = grid[0].size();
23+
int ans = 0;
24+
vector<vector<int>> sum(m+1, vector<int>(n+1));
25+
26+
for(int i = 0; i < m; ++i) {
27+
for(int j = 0; j < n; ++j) {
28+
sum[i+1][j+1] = sum[i][j+1] + sum[i+1][j] - sum[i][j] + grid[i][j];
29+
if(sum[i+1][j+1] <= k) ++ans;
30+
else break; // 优化:该行后续必然超过 k
31+
}
32+
}
33+
return ans;
34+
}
35+
};
36+
```
37+
38+
**复杂度**:时间 O(m*n),空间 O(m*n)
39+
40+
---
41+
42+
## 方法一拓展:原地二维前缀和
43+
44+
直接在 grid 数组上修改,省去额外空间。
45+
46+
```cpp
47+
// 原地二维前缀和
48+
class Solution {
49+
public:
50+
int countSubmatrices(vector<vector<int>>& grid, int k) {
51+
int m = grid.size(), n = grid[0].size();
52+
int ans = 0;
53+
54+
for(int i = 0; i < m; ++i) {
55+
for(int j = 0; j < n; ++j) {
56+
if(i > 0) grid[i][j] += grid[i-1][j];
57+
if(j > 0) grid[i][j] += grid[i][j-1];
58+
if(i > 0 && j > 0) grid[i][j] -= grid[i-1][j-1];
59+
60+
if(grid[i][j] <= k) ++ans;
61+
else break; // 优化:该行后续必然超过 k
62+
}
63+
}
64+
return ans;
65+
}
66+
};
67+
```
68+
69+
**复杂度**:时间 O(m\*n),空间 O(1)
70+
71+
---
72+
73+
## 方法二:维护每列的元素和
74+
75+
### 思路
76+
77+
- 逐行扫描,用 `col_sum[j]` 维护每列的累积和
78+
- 每行从左到右扫,累加行前缀和 `s`
79+
- 一旦 `s > k` 就停止(后续必然更大)
80+
81+
```cpp
82+
// 维护每列元素和
83+
class Solution {
84+
public:
85+
int countSubmatrices(vector<vector<int>>& grid, int k) {
86+
int n = grid[0].size();
87+
vector<int> col_sum(n);
88+
int ans = 0;
89+
90+
for(auto &row : grid) {
91+
int s = 0;
92+
for(int j = 0; j < n; ++j) {
93+
col_sum[j] += row[j];
94+
s += col_sum[j];
95+
if(s > k) break;
96+
++ans;
97+
}
98+
}
99+
return ans;
100+
}
101+
};
102+
```
103+
104+
**复杂度**:时间 O(m\*n),空间 O(n)
105+
106+
---
107+
108+
## 总结
109+
110+
| 方法 | 空间 | 优点 |
111+
| -------------- | ------- | --------------------- |
112+
| 二维前缀和 | O(m\*n) | 逻辑清晰,易理解 |
113+
| 原地二维前缀和 | O(1) | 空间高效 |
114+
| 维护每列和 | O(n) | 最优空间 + 最清晰逻辑 |
115+
116+
**推荐**:方法二(维护每列和)= 最优空间 + 最清晰逻辑```
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include <vector>
2+
3+
using namespace std;
4+
class Solution {
5+
public:
6+
int numberOfSubmatrices(vector<vector<char>>& grid) {
7+
int m = grid.size(),n = grid[0].size();
8+
vector<vector<int>> x_cnt(m,vector<int>(n));
9+
vector<vector<int>> y_cnt(m,vector<int>(n));
10+
11+
12+
}
13+
};

0 commit comments

Comments
 (0)