⭐️寒假新坑——代码之狐的每日做题笔记
😢寒假快到期了😢
2088. 统计农场中肥沃金字塔的数目-Hard(前缀和快速检测数组)-第 66 场双周赛题4
有一个 矩形网格 状的农场,划分为 m
行 n
列的单元格。每个格子要么是 肥沃的 (用 1
表示),要么是 贫瘠 的(用 0
表示)。网格图以外的所有与格子都视为贫瘠的。
农场中的 金字塔 区域定义如下:
- 区域内格子数目 大于
1
且所有格子都是 肥沃的 。 - 金字塔 顶端 是这个金字塔 最上方 的格子。金字塔的高度是它所覆盖的行数。令
(r, c)
为金字塔的顶端且高度为h
,那么金字塔区域内包含的任一格子(i, j)
需满足r <= i <= r + h - 1
且c - (i - r) <= j <= c + (i - r)
。
一个 倒金字塔 类似定义如下:
- 区域内格子数目 大于
1
且所有格子都是 肥沃的 。 - 倒金字塔的 顶端 是这个倒金字塔 最下方 的格子。倒金字塔的高度是它所覆盖的行数。令
(r, c)
为金字塔的顶端且高度为h
,那么金字塔区域内包含的任一格子(i, j)
需满足r - h + 1 <= i <= r
且c - (r - i) <= j <= c + (r - i)
。
class Solution {
public int countPyramids(int[][] grid) {
int m=grid.length;
int n=grid[0].length;
for(int i=0;i<m;i++){
for(int k=0;k<n;k++){
if(k!=0){
grid[i][k]+=grid[i][k-1];
}
}
}
int ans=0;
for(int x=0;x<m;x++){
for(int y=0;y<n;y++){
int h=1;
if(y==0&&grid[x][y]==0){
continue;
}
if(y!=0&&grid[x][y]-grid[x][y-1]==0){
continue;
}
while(x+h<m&&y+h<n&&y-h>=0){
int sum=0;
if(y-h==0){
sum=grid[x+h][y+h];
}
else{
sum=grid[x+h][y+h]-grid[x+h][y-h-1];
}
if(sum==2*h+1){
ans++;
h++;
}
else{
break;
}
}
h=1;
while(x-h>=0&&y+h<n&&y-h>=0){
int sum=0;
if(y-h==0){
sum=grid[x-h][y+h];
}
else{
sum=grid[x-h][y+h]-grid[x-h][y-h-1];
}
if(sum==2*h+1){
ans++;
h++;
}
else{
break;
}
}
}
}
return ans;
}
}
结尾
题目来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems
⭐️关注作者,带你刷题,从简单的算法题了解最常用的算法技能(寒假每日一题)
⭐️关注作者刷题——简单到进阶,让你不知不觉成为无情的刷题机器,有问题请私信