二维数组前缀和
二维数组差分
class Solution {
public:
bool possibleToStamp(vector<vector<int>>& grid, int sH, int sW) {
int m = grid.size(), n = grid[0].size();
vector<vector<int>> s(m + 1, vector<int>(n + 1));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + grid[i - 1][j - 1];
}
}
vector<vector<int>> d(m + 2, vector<int>(n + 2));
for (int i = 1; i + sH - 1 <= m; i++) {
for (int j = 1; j + sW - 1 <= n; j++) {
int x = i + sH - 1;
int y = j + sW - 1;
if (s[x][y] - s[x][j - 1] - s[i - 1][y] + s[i - 1][j - 1] == 0) {
d[i][j]++, d[x + 1][y + 1]++;
d[x + 1][j]--, d[i][y + 1]--;
}
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
d[i][j] += d[i - 1][j] + d[i][j - 1] - d[i - 1][j - 1];
if (d[i][j] == 0 && grid[i - 1][j - 1] == 0) return false;
}
}
return true;
}
};