首页 > 编程语言 >【教3妹学编程-算法题】用邮票贴满网格图

【教3妹学编程-算法题】用邮票贴满网格图

时间:2023-12-15 23:01:31浏览次数:38  
标签:邮票 stampHeight int stampWidth 网格 妹学 空格 grid 贴满

【教3妹学编程-算法题】用邮票贴满网格图_java代码

3妹:“你不是真正的快乐, 你的笑只是你穿的保护色”
2哥 : 3妹还在唱五月天的歌啊, 你不知道五月天假唱,现在全网都在骂呢。
3妹:知道啊,可是关我什么事,这个歌的确好听啊。
2哥 : 嗯嗯,不错, 还以为你是脑残粉,无论黑白都只管追星呢。
3妹:我是只管追歌的, 歌好听就行啦。
2哥 : 追哥?追哪个哥, 难道是我这个2哥~
3妹:切,谐音梗扣钱!
2哥:话说五月天演唱会的门票还挺贵的, 要上千了, 粉丝们花了钱如果听的假唱,要伤心了。3妹会花1000块购买演唱会门票吗?
3妹:我不会买门票,但是我会买邮票,因为我是一个集邮爱好者~
2哥:说到邮票,我这里有一个关于邮票的题目,让我来考考你吧~

【教3妹学编程-算法题】用邮票贴满网格图_i++_02

 1题目: 

给你一个 m x n 的二进制矩阵 grid ,每个格子要么为 0 (空)要么为 1 (被占据)。

给你邮票的尺寸为 stampHeight x stampWidth 。我们想将邮票贴进二进制矩阵中,且满足以下 限制 和 要求 :

覆盖所有 空 格子。
不覆盖任何 被占据 的格子。
我们可以放入任意数目的邮票。
邮票可以相互有 重叠 部分。
邮票不允许 旋转 。
邮票必须完全在矩阵 内 。
如果在满足上述要求的前提下,可以放入邮票,请返回 true ,否则返回 false 。

示例 1:


【教3妹学编程-算法题】用邮票贴满网格图_java代码_03

输入:grid = [[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,0]], stampHeight = 4, stampWidth = 3
输出:true
解释:我们放入两个有重叠部分的邮票(图中标号为 1 和 2),它们能覆盖所有与空格子。
示例 2:


【教3妹学编程-算法题】用邮票贴满网格图_java代码_04

输入:grid = [[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]], stampHeight = 2, stampWidth = 2
输出:false
解释:没办法放入邮票覆盖所有的空格子,且邮票不超出网格图以外。

提示:

m == grid.length
n == grid[r].length
1 <= m, n <= 10^5
1 <= m * n <= 2 * 10^5
grid[r][c] 要么是 0 ,要么是 1 。
1 <= stampHeight, stampWidth <= 10^5

 1思路: 

【教3妹学编程-算法题】用邮票贴满网格图_二维_05

二维前缀和与二维差分,

题目要求使用固定尺寸的邮票贴进二进制矩阵中,由于邮票之间可以重叠,因此我们本着能放就放的原则,遍历每个空格作为邮票左上角,如果右下角形状为 stampHeight×stampWidth的范围内都是空格子,那么就在这贴一个邮票。

最后,如果有空格子没有被邮票覆盖,则说明无法满足题目要求,返回 false,反之如果所有的空格子都被邮票覆盖,返回 true。

 1java代码: 

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;
    }
}

标签:邮票,stampHeight,int,stampWidth,网格,妹学,空格,grid,贴满
From: https://blog.51cto.com/u_6813689/8845434

相关文章

  • 探索服务网格与 OpenTelemetry 的协同之分布式跟踪
    在上一篇文章中,介绍了如何在k8s中无侵入安装Otel探针并实现了无侵入(某些语言还无法实现,比如Go的eBPF对内核的苛刻要求)的分布式跟踪。这篇文章发出后有读者评论javaagent的“无侵入”一说,这里有必要解释下。“无侵入”主要指的是不需要修改应用程序的业务逻辑代码就......
  • 【教3妹学编程-算法题】交换得到字典序最小的数组
    3妹:2哥2哥,你有没有看到新闻:周海媚姐因病医治无效,于2023年12月11日离开了我们。2哥 :看到了,真是个悲伤的消息,早晨还看到辟谣,以为没事了呢。3妹:是啊,#再见周芷若#2哥:童年的女神,周海媚演的这版“周芷若”真的很深入人心!被评为“最美周芷若”3妹:哎,人有生老病死,R.I.P.2哥:唉,说点高兴的......
  • Sermant:无代理服务网格架构解析及无门槛玩转插件开发
    本文分享自华为云社区《Sermant:无代理服务网格架构解析及无门槛玩转插件开发》,作者:华为云社区精选。本期直播的主题是《从架构设计到开发实践,深入浅出了解Sermant》,华为云云原生DTSE技术布道师、华为云高级工程师、Sermant开源社区PMC核心成员栾文飞,为广大开发者详细从架构设计......
  • 【教3妹学编程-算法题】需要添加的硬币的最小数量
    3妹:2哥2哥,你有没有看到新闻,有人中了2.2亿彩票大奖!2哥 :看到了,2.2亿啊,一生一世也花不完。3妹:为啥我就中不了呢,不开心呀不开心。2哥 :得了吧,你又不买彩票,还是脚踏实地的好~3妹:小富靠勤,中富靠德,大富靠命,可能是我命不好。2哥 :哎,想我口袋只有几个硬币,叮咚作响。3妹:说到硬币,我......
  • 【教3妹学编程-算法题】购买水果需要的最少金币数
    3妹:“你不是真正的快乐,你的笑只是你穿的保护色”2哥 :3妹还在唱五月天的歌啊,你不知道五月天假唱,现在全网都在骂呢。3妹:知道啊,可是关我什么事,这个歌的确好听啊。2哥 :嗯嗯,不错,还以为你是脑残粉,无论黑白都只管追星呢。3妹:我是只管追歌的,歌好听就行啦。2哥 :追哥?追哪个哥,难......
  • three.js 使用 sortObjects 和 renderOrder 处理网格修改后覆盖模型的问题
    问题效果:目标效果处理此问题首先需要了解three的渲染机制:渲染机制threejs的渲染器是基于webGL的。它的渲染机制是根据物体离照相机的距离来控制和进行渲染的。也就是说,它根据物体的空间位置进行排序,然后根据这个顺序来渲染物体。对于透明的物体,是按照从最远到最近的顺序进行......
  • 设置子网格过滤条件
    有时候需要设置子网格不显示当前表单实体的相关记录,而是显示与其他查找字段的相关记录,可配置如下再加上以下代码,即可实现仅显示与客户关联的stock记录。 "usestrict";varAEntityForm=window.AEntityForm||{};(function(){this.formOnLoad=function(contex......
  • 工程师都喜欢的一款自动生成网格的仿真软件——Hyperworks到底好不好用?
    HyperWorks是一款广泛应用于工程仿真和优化的软件平台,其中包括了许多强大的工具和功能。其中的网格自动生成工具是其重要组成部分之一,对于工程仿真和优化来说具有重要的意义。那么,HyperWorks的网格自动生成工具到底好不好用呢?接下来我们将对此展开讨论。首先,HyperWorks的网格自......
  • 【教3妹学编程-算法题】拼车
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥 :3妹,什么事呀这么开发。3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。2哥:是啊,立冬之后天气多以多云为主,好不容易艳阳高照。可是你不能秋游,赶紧收拾收拾上班去啦3妹:哼,好吧~2哥:给你出了一道题......
  • 防御式CSS—网格布局中的列自动分配
    当使用CSSgridminmax()函数时,重要的是要决定使用auto-fit或auto-fill关键字。如果使用不当,可能会导致意想不到的结果。当使用minmax()函数时,auto-fit关键字将扩展网格项以填充可用空间。而auto-fill将保留可用空间,而不改变网格项的宽度。也就是说,使用auto-fit......