【每日一题见微知著】前缀和——统计农场中肥沃金字塔的数目

本文是代码之狐的每日做题笔记,探讨LeetCode第2088题——统计农场中肥沃金字塔的数目。题目要求在矩形网格中找到肥沃金字塔和倒金字塔的数量,所有肥沃的格子构成的区域必须大于特定大小。文章介绍了金字塔和倒金字塔的定义,并提供了问题来源链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

⭐️寒假新坑——代码之狐的每日做题笔记
😢寒假快到期了😢

2088. 统计农场中肥沃金字塔的数目-Hard(前缀和快速检测数组)-第 66 场双周赛题4

有一个 矩形网格 状的农场,划分为 mn 列的单元格。每个格子要么是 肥沃的 (用 1 表示),要么是 贫瘠 的(用 0 表示)。网格图以外的所有与格子都视为贫瘠的。

农场中的 金字塔 区域定义如下:

  1. 区域内格子数目 大于 1 且所有格子都是 肥沃的
  2. 金字塔 顶端 是这个金字塔 最上方 的格子。金字塔的高度是它所覆盖的行数。令 (r, c) 为金字塔的顶端且高度为 h ,那么金字塔区域内包含的任一格子 (i, j) 需满足 r <= i <= r + h - 1 c - (i - r) <= j <= c + (i - r)

一个 倒金字塔 类似定义如下:

  1. 区域内格子数目 大于 1 且所有格子都是 肥沃的
  2. 倒金字塔的 顶端 是这个倒金字塔 最下方 的格子。倒金字塔的高度是它所覆盖的行数。令 (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

⭐️关注作者,带你刷题,从简单的算法题了解最常用的算法技能(寒假每日一题)
⭐️关注作者刷题——简单到进阶,让你不知不觉成为无情的刷题机器,有问题请私信

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码之狐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值