Skip to content

Commit 67c5207

Browse files
committed
feat: add solutions to lc problem: No.2132
No.2132.Stamping the Grid
1 parent c77927e commit 67c5207

File tree

9 files changed

+585
-1
lines changed

9 files changed

+585
-1
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
- [字符串相加](/solution/0400-0499/0415.Add%20Strings/README.md) - 高精度加法
4343
- [字符串相乘](/solution/0000-0099/0043.Multiply%20Strings/README.md) - 高精度乘法
4444
- [二维区域和检索 - 矩阵不可变](/solution/0300-0399/0304.Range%20Sum%20Query%202D%20-%20Immutable/README.md) - 二维前缀和
45+
- [ 用邮票贴满网格图](/solution/2100-2199/2132.Stamping%20the%20Grid/README.md) - 二维前缀和、二维差分
4546
<!-- 排序算法、待补充 -->
4647

4748
### 2. 搜索

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
4141
- [Add Strings](/solution/0400-0499/0415.Add%20Strings/README_EN.md) - Addition of large numbers
4242
- [Multiply Strings](/solution/0000-0099/0043.Multiply%20Strings/README_EN.md) - Multiply large numbers
4343
- [Range Sum Query 2D - Immutable](/solution/0300-0399/0304.Range%20Sum%20Query%202D%20-%20Immutable/README_EN.md) - Prefix sum
44+
- [ Stamping the Grid](/solution/2100-2199/2132.Stamping%20the%20Grid/README_EN.md) - Prefix sum, Difference array
4445

4546
### 2. Search
4647

solution/2100-2199/2132.Stamping the Grid/README.md

+200-1
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,221 @@
5858

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

61+
**方法一:二维前缀和 + 二维差分**
62+
6163
<!-- tabs:start -->
6264

6365
### **Python3**
6466

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

6769
```python
68-
70+
class Solution:
71+
def possibleToStamp(self, grid: List[List[int]], stampHeight: int, stampWidth: int) -> bool:
72+
m, n = len(grid), len(grid[0])
73+
s = [[0] * (n + 1) for _ in range(m + 1)]
74+
for i, row in enumerate(grid):
75+
for j, v in enumerate(row):
76+
s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + v
77+
78+
d = [[0] * (n + 1) for _ in range(m + 1)]
79+
for i, row in enumerate(grid):
80+
for j, v in enumerate(row):
81+
if v == 0:
82+
x, y = i + stampHeight, j + stampWidth
83+
if x <= m and y <= n and s[x][y] - s[x][j] - s[i][y] + s[i][j] == 0:
84+
d[i][j] += 1
85+
d[i][y] -= 1
86+
d[x][j] -= 1
87+
d[x][y] += 1
88+
89+
cnt = [[0] * (n + 1) for _ in range(m + 1)]
90+
for i, row in enumerate(grid):
91+
for j, v in enumerate(row):
92+
cnt[i + 1][j + 1] = cnt[i + 1][j] + cnt[i][j + 1] - cnt[i][j] + d[i][j]
93+
if v == 0 and cnt[i + 1][j + 1] == 0:
94+
return False
95+
return True
6996
```
7097

7198
### **Java**
7299

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

75102
```java
103+
class Solution {
104+
public boolean possibleToStamp(int[][] grid, int stampHeight, int stampWidth) {
105+
int m = grid.length, n = grid[0].length;
106+
int[][] s = new int[m + 1][n + 1];
107+
for (int i = 0; i < m; ++i) {
108+
for (int j = 0; j < n; ++j) {
109+
s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + grid[i][j];
110+
}
111+
}
112+
int[][] d = new int[m + 1][n + 1];
113+
for (int i = 0; i < m; ++i) {
114+
for (int j = 0; j < n; ++j) {
115+
if (grid[i][j] == 0) {
116+
int x = i + stampHeight, y = j + stampWidth;
117+
if (x <= m && y <= n && s[x][y] - s[x][j] - s[i][y] + s[i][j] == 0) {
118+
d[i][j]++;
119+
d[i][y]--;
120+
d[x][j]--;
121+
d[x][y]++;
122+
}
123+
}
124+
}
125+
}
126+
int[][] cnt = new int[m + 1][n + 1];
127+
for (int i = 0; i < m; ++i) {
128+
for (int j = 0; j < n; ++j) {
129+
cnt[i + 1][j + 1] = cnt[i + 1][j] + cnt[i][j + 1] - cnt[i][j] + d[i][j];
130+
if (grid[i][j] == 0 && cnt[i + 1][j + 1] == 0) {
131+
return false;
132+
}
133+
}
134+
}
135+
return true;
136+
}
137+
}
138+
```
139+
140+
### **C++**
141+
142+
```cpp
143+
class Solution {
144+
public:
145+
bool possibleToStamp(vector<vector<int>>& grid, int stampHeight, int stampWidth) {
146+
int m = grid.size(), n = grid[0].size();
147+
vector<vector<int>> s(m + 1, vector<int>(n + 1));
148+
for (int i = 0; i < m; ++i)
149+
{
150+
for (int j = 0; j < n; ++j)
151+
{
152+
s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + grid[i][j];
153+
}
154+
}
155+
vector<vector<int>> d(m + 1, vector<int>(n + 1));
156+
for (int i = 0; i < m; ++i)
157+
{
158+
for (int j = 0; j < n; ++j)
159+
{
160+
if (grid[i][j]) continue;
161+
int x = i + stampHeight, y = j + stampWidth;
162+
if (x <= m && y <= n && s[x][y] - s[i][y] - s[x][j] + s[i][j] == 0)
163+
{
164+
d[i][j]++;
165+
d[x][j]--;
166+
d[i][y]--;
167+
d[x][y]++;
168+
}
169+
}
170+
}
171+
vector<vector<int>> cnt(m + 1, vector<int>(n + 1));
172+
for (int i = 0; i < m; ++i)
173+
{
174+
for (int j = 0; j < n; ++j)
175+
{
176+
cnt[i + 1][j + 1] = cnt[i + 1][j] + cnt[i][j + 1] - cnt[i][j] + d[i][j];
177+
if (grid[i][j] == 0 && cnt[i + 1][j + 1] == 0) return false;
178+
}
179+
}
180+
return true;
181+
}
182+
};
183+
```
184+
185+
### **Go**
186+
187+
```go
188+
func possibleToStamp(grid [][]int, stampHeight int, stampWidth int) bool {
189+
m, n := len(grid), len(grid[0])
190+
s := make([][]int, m+1)
191+
d := make([][]int, m+1)
192+
cnt := make([][]int, m+1)
193+
for i := range s {
194+
s[i] = make([]int, n+1)
195+
d[i] = make([]int, n+1)
196+
cnt[i] = make([]int, n+1)
197+
}
198+
for i, row := range grid {
199+
for j, v := range row {
200+
s[i+1][j+1] = s[i+1][j] + s[i][j+1] - s[i][j] + v
201+
}
202+
}
203+
for i, row := range grid {
204+
for j, v := range row {
205+
if v == 0 {
206+
x, y := i+stampHeight, j+stampWidth
207+
if x <= m && y <= n && s[x][y]-s[i][y]-s[x][j]+s[i][j] == 0 {
208+
d[i][j]++
209+
d[i][y]--
210+
d[x][j]--
211+
d[x][y]++
212+
}
213+
}
214+
}
215+
}
216+
for i, row := range grid {
217+
for j, v := range row {
218+
cnt[i+1][j+1] = cnt[i+1][j] + cnt[i][j+1] - cnt[i][j] + d[i][j]
219+
if v == 0 && cnt[i+1][j+1] == 0 {
220+
return false
221+
}
222+
}
223+
}
224+
return true
225+
}
226+
```
76227

228+
### **JavaScript**
229+
230+
```js
231+
/**
232+
* @param {number[][]} grid
233+
* @param {number} stampHeight
234+
* @param {number} stampWidth
235+
* @return {boolean}
236+
*/
237+
var possibleToStamp = function (grid, stampHeight, stampWidth) {
238+
const m = grid.length;
239+
const n = grid[0].length;
240+
let s = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));
241+
let d = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));
242+
let cnt = new Array(m + 1).fill(0).map(() => new Array(n + 1).fill(0));
243+
for (let i = 0; i < m; ++i) {
244+
for (let j = 0; j < n; ++j) {
245+
s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + grid[i][j];
246+
}
247+
}
248+
for (let i = 0; i < m; ++i) {
249+
for (let j = 0; j < n; ++j) {
250+
if (grid[i][j] == 0) {
251+
let [x, y] = [i + stampHeight, j + stampWidth];
252+
if (
253+
x <= m &&
254+
y <= n &&
255+
s[x][y] - s[i][y] - s[x][j] + s[i][j] == 0
256+
) {
257+
d[i][j]++;
258+
d[i][y]--;
259+
d[x][j]--;
260+
d[x][y]++;
261+
}
262+
}
263+
}
264+
}
265+
for (let i = 0; i < m; ++i) {
266+
for (let j = 0; j < n; ++j) {
267+
cnt[i + 1][j + 1] =
268+
cnt[i + 1][j] + cnt[i][j + 1] - cnt[i][j] + d[i][j];
269+
if (grid[i][j] == 0 && cnt[i + 1][j + 1] == 0) {
270+
return false;
271+
}
272+
}
273+
}
274+
return true;
275+
};
77276
```
78277

79278
### **TypeScript**

0 commit comments

Comments
 (0)