力扣每日一题--2088. 统计农场中肥沃金字塔的数目

这篇具有很好参考价值的文章主要介绍了力扣每日一题--2088. 统计农场中肥沃金字塔的数目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

力扣每日一题--2088. 统计农场中肥沃金字塔的数目,leetcode,算法,职场和发展

看到这道题有些人很容易放弃,其实这道题不是很难,主要是题目长,读的容易让人放弃,但是

只要抓住一些性质就可以解决该问题。

    本题中的定义放到图像里其实就是个金字塔,下层的那部分比上一层的那部分,长度加2,

并且该层那个长度区间内都是1才行。是个金字塔形状里都是1就行。

 我们暴力的解法是什么呢?,其实就是遍历整个数组,以每个数组下标为金子塔尖,往下去统计有多少个金字塔,那么这个的时间复杂度是1e8,会超时,所以我们得想别的方法去优化统计多少个金字塔这部分方面去想。那么我们再深入思考一下,我们每次遍历的时候,每次都要向下去统计金字塔,那在统计的时候,我们每次都要关注当前外层是否从上一层外层下来,统计好之后我们怎么想呢?目前已经知道我们的行数是确定的,那么其实只要他的下面的外层可以延伸到金字塔尖的话,我们就可以根据行数和外层可以延伸的长度那么我们就可以知道金字塔数量了,

求每个塔尖的话都是可以这样的,那么外层可以延伸的长度和行数我们怎么确定呢?以正金字塔为例子,一是预处理出来,但是这样复杂度还是比较高,那么我们是不是可以想一下从下往上遍历的话,我们是不是就可以固定金字塔的高度了,比如当前点是i,j,那可以从i + 2到i + 1,i + 1到i。那么高度我们已经确定好了,怎么去确定可以延伸的长度呢?

这个确实不好想,我们目前推出来的只知道每一次长度相差为2,只知道判断从左下角上来,

从右下角上来,但是不知道他中间那段能不能上来,现在就是要确定中间那段如何让他上来,

但是我们仔细想想的话,根据前面的推导,我们在向上推的话,我们是不是只能推导到金字塔尖,那么如果不是金子塔尖呢?我们该怎么去推导呢?其实到这里我们就已经知道了,这是一个动态规划问题,那么动态规划问题的本质是什么呢?找子问题,那么我们是不是可以想一下,最顶上的金子塔尖,是不是可以从下层的金字塔尖推上去,是可以的,我们只用知道左下角,下方,右下角上来就知道了,去个min就可以了,那么状态转移方程就是

f[i][j] = min(f[i + 1][j],min(f[i + 1][j + 1],f[i + 1][j - 1])) + 1;文章来源地址https://www.toymoban.com/news/detail-799847.html

class Solution {
public:
    int f[1100][1100];
    int countPyramids(vector<vector<int>>& grid) 
    {
        memset(f,0,sizeof(f));
        int n = grid.size(),m = grid[0].size();
        //i + 1,j
        //i + 1,j - 1
        //i + 1,j + 1
        int ans = 0;
        for(int i = n - 1;i >= 0;i--)
        {
           for(int j = 0;j < m;j++)
           {
              if(grid[i][j] == 0) continue;
              if(j - 1 < 0 || j + 1 >= m || i + 1 >= n) continue;
              if(grid[i + 1][j] == 0 || grid[i + 1][j - 1] == 0 || grid[i + 1][j + 1] == 0) continue;
              f[i][j] = min(f[i + 1][j],min(f[i + 1][j + 1],f[i + 1][j - 1])) + 1;
              ans += f[i][j];
           }
        }

        //i - 1,j
        //i - 1,j - 1
        //i - 1,j + 1
        memset(f,0,sizeof(f));
        for(int i = 0;i < n;i++)
        {
           for(int j = 0;j < m;j++)
           {
              if(grid[i][j] == 0) continue;
              if(i - 1 < 0 || j + 1 >= m || j - 1 < 0) continue;
              if(grid[i - 1][j] == 0 || grid[i - 1][j - 1] == 0 || grid[i - 1][j + 1] == 0) continue;
              f[i][j] = min(f[i - 1][j],min(f[i - 1][j + 1],f[i - 1][j - 1])) + 1;
              ans += f[i][j];
           }
        }
        return ans;
    }
};

到了这里,关于力扣每日一题--2088. 统计农场中肥沃金字塔的数目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv基础45-图像金字塔01-高斯金字塔cv2.pyrDown()

    图像金字塔(Image Pyramid)是一种用于多尺度图像处理和分析的技术,它通过构建一系列不同分辨率的图像,从而使得图像可以在不同尺度下进行处理和分析。图像金字塔在计算机视觉、图像处理和计算机图形学等领域中广泛应用,可以用于目标检测、特征提取、图像匹配、尺

    2024年02月13日
    浏览(27)
  • 【力扣每日一题】力扣2765最长交替子数组

    力扣2765最长交替子数组 给你一个下标从 0 开始的整数数组 nums 。如果 nums 中长度为 m 的子数组 s 满足以下条件,我们称它是一个 交替子数组 : m  大于  1  。  s1  =  s0  +  1  。 下标从  0  开始的子数组  s  与数组 [ s0 ,  s1 ,  s0 ,  s1 ,..., s(m-1) % 2 ] 一样。也就是说,

    2024年01月24日
    浏览(40)
  • 力扣每日一题90:子集

    给你一个整数数组  nums  ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集  不能  包含重复的子集。返回的解集中,子集可以按  任意顺序  排列。 示例 1: 示例 2: 提示: 1 = nums.length = 10 -10 = nums[i] = 10 通过次数 330.7K 提交次数 520.9K 通过率 63

    2024年02月06日
    浏览(21)
  • 2023-07-16力扣每日一题

    链接: 834. 树中距离之和 题意: 给定一个树,有n个节点,需要得到每个节点与其他节点的距离和 解: 还以为是弗洛伊德,一看范围3E4直接晕倒 想了四个小时,实在是想不出来了,看了一下评论里的转移公式 设 DP[i] 为节点 i 与其他节点的距离和, DP[F] 是节点 i 的父节点与

    2024年02月16日
    浏览(30)
  • 2023-08-25力扣每日一题

    链接: 1448. 统计二叉树中好节点的数目 题意: 判断根节点到每个节点X的过程中,如果没有值大于X,则该节点为好节点,求好节点数量 解: 由于求根节点到其他节点的路径,则使用dfs算法,更新路径中的最大值即可 实际代码: 限制: 二叉树中节点数目范围是 [1, 10^5] 。

    2024年02月10日
    浏览(33)
  • 2023-09-08力扣每日一题

    链接: 2651. 计算列车到站时间 题意: 不看日期只看时间 解: ? 实际代码: 限制: 1 = arrivaltime 24 1 = delayedTime = 24

    2024年02月09日
    浏览(27)
  • 2023-08-09力扣每日一题

    链接: 1281. 整数的各位积和之差 题意: 十进制每一位的积减去每一位的和 解: 十进制位处理 实际代码: 限制: 1 = n = 10^5

    2024年02月13日
    浏览(30)
  • 2023-09-01力扣每日一题

    链接: 2240. 买钢笔和铅笔的方案数 题意: 一共total元,两种笔分别cost1和cost2元,求能买的的笔的所有情况,不要求花光钱 解: 枚举其中一个数字就行 实际代码: 限制: 1 = total, cost1, cost2 = 106

    2024年02月10日
    浏览(29)
  • 2023-09-02力扣每日一题

    链接: 2511. 最多可以摧毁的敌人城堡数目 题意和解 : 阅读理解题,要从1到-1或-1到1,中间只能有0,求最多能有多少0 实际代码: 限制: 1 = forts.length = 1000 -1 = forts[i] = 1

    2024年02月10日
    浏览(29)
  • 2023-07-11力扣每日一题

    链接: https://leetcode.cn/problems/maximum-alternating-subsequence-sum/ 题意: 给定一个数组,求一个子序列,使这个子序列的 奇数位和-偶数位和 最大(下标从1开始的话|反正第一个数是+) 解: 找下坡,曲折处两个分下坡大于一个总下坡(如图) 实际代码: 思维: DP?: 限制: 1 = nu

    2024年02月15日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包