2023.12.14
- 题目来源
- 我的题解
- 二维前缀和+二维差分
题目来源
力扣每日一题;题序:2132
我的题解
哈哈哈哈!!!我不会,借鉴一下官方题解
二维前缀和+二维差分
- 求二维前缀和,用于判断快速判断右下角固定范围内不存在被占据的格子,而都是空格子。
- 二维差分,用于快速判断每个空格子都被邮票覆盖。
时间复杂度:O(mn)
空间复杂度:O(mn)
class Solution {
public boolean possibleToStamp(int[][] grid, int stampHeight, int stampWidth) {
int m = grid.length, n = grid[0].length;
int[][] sum = new int[m + 2][n + 2];
int[][] diff = new int[m + 2][n + 2];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + grid[i - 1][j - 1];
}
}
for (int i = 1; i + stampHeight - 1 <= m; i++) {
for (int j = 1; j + stampWidth - 1 <= n; j++) {
int x = i + stampHeight - 1;
int y = j + stampWidth - 1;
if (sum[x][y] - sum[x][j - 1] - sum[i - 1][y] + sum[i - 1][j - 1] == 0) {
diff[i][j]++;
diff[i][y + 1]--;
diff[x + 1][j]--;
diff[x + 1][y + 1]++;
}
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
diff[i][j] += diff[i - 1][j] + diff[i][j - 1] - diff[i - 1][j - 1];
if (diff[i][j] == 0 && grid[i - 1][j - 1] == 0) {
return false;
}
}
}
return true;
}
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~