力扣每日一题
题目:2132. 用邮票贴满网格图
日期:2023-12-14
用时:38 m 32 s
思路:使用前缀和+差分,只是往常是一维,现在变二维了,原理差不多
时间:22ms
内存:98.24MB
代码:
class Solution {public boolean possibleToStamp(int[][] grid, int stampHeight, int stampWidth) {int xl = grid.length;int yl = grid[0].length;// 前缀和int[][] sum = new int[xl+1][yl+1];for(int i=1;i<=xl;i++){for(int j=1;j<=yl;j++){sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+grid[i-1][j-1];}}// 差分int[][] cnt = new int[xl+2][yl+2];for(int xStart=stampHeight;xStart<=xl;xStart++){for(int yStart=stampWidth;yStart<=yl;yStart++){int xEnd = xStart-stampHeight+1;int yEnd = yStart-stampWidth+1;if(sum[xStart][yStart]+sum[xEnd-1][yEnd-1]-sum[xStart][yEnd-1]-sum[xEnd-1][yStart]==0){cnt[xEnd][yEnd]++;cnt[xStart+1][yStart+1]++;cnt[xEnd][yStart+1]--;cnt[xStart+1][yEnd]--;}}}// 判断单元格是否能放邮戳for(int i=1;i<=xl;i++){for(int j=1;j<=yl;j++){cnt[i][j] += cnt[i][j-1]+cnt[i-1][j]-cnt[i-1][j-1];if(grid[i-1][j-1]==0&&cnt[i][j]==0){return false;}}}return true;}
}