Leetcode.2257 统计网格图中没有被保卫的格子数

news2024/11/14 12:17:54

题目链接

Leetcode.2257 统计网格图中没有被保卫的格子数 Rating : 1709

题目描述

给你两个整数 mn表示一个下标从 0开始的 m x n网格图。同时给你两个二维整数数组 guardswalls,其中 guards[i] = [rowi, coli]walls[j] = [rowj, colj],分别表示第 i个警卫和第 j座墙所在的位置。

一个警卫能看到 4个坐标轴方向(即东、南、西、北)的 所有 格子,除非他们被一座墙或者另外一个警卫 挡住 了视线。如果一个格子能被 至少 一个警卫看到,那么我们说这个格子被 保卫 了。

请你返回空格子中,有多少个格子是 没被保卫 的。

示例 1:

在这里插入图片描述

输入:m = 4, n = 6, guards = [[0,0],[1,1],[2,3]], walls = [[0,1],[2,2],[1,4]]
输出:7
解释:上图中,被保卫和没有被保卫的格子分别用红色和绿色表示。
总共有 7 个没有被保卫的格子,所以我们返回 7 。

示例 2:

在这里插入图片描述

输入:m = 3, n = 3, guards = [[1,1]], walls = [[0,1],[1,0],[2,1],[1,2]]
输出:4
解释:上图中,没有被保卫的格子用绿色表示。
总共有 4 个没有被保卫的格子,所以我们返回 4 。

提示:

  • 1 < = m , n < = 1 0 5 1 <= m, n <= 10^5 1<=m,n<=105
  • 2 < = m ∗ n < = 1 0 5 2 <= m * n <= 10^5 2<=mn<=105
  • 1 < = g u a r d s . l e n g t h , w a l l s . l e n g t h < = 5 ∗ 1 0 4 1 <= guards.length, walls.length <= 5 * 10^4 1<=guards.length,walls.length<=5104
  • 2 < = g u a r d s . l e n g t h + w a l l s . l e n g t h < = m ∗ n 2 <= guards.length + walls.length <= m * n 2<=guards.length+walls.length<=mn
  • g u a r d s [ i ] . l e n g t h = = w a l l s [ j ] . l e n g t h = = 2 guards[i].length == walls[j].length == 2 guards[i].length==walls[j].length==2
  • 0 < = r o w i , r o w j < m 0 <= rowi, rowj < m 0<=rowi,rowj<m
  • 0 < = c o l i , c o l j < n 0 <= coli, colj < n 0<=coli,colj<n
  • guardswalls中所有位置 互不相同

分析:

我们先建立一个 m*n的表格g

g[i][j] = -1代表位置 (i,j)有 墙。

g[i][j] = 2代表位置 (i,j)有 警卫。

g[i][j] = 1代表位置 (i,j)已经被 警卫 看过了。

我们从每个 警卫的位置开始 BFS(上下左右四个方向遍历),遇到墙 或者 遇到警卫(如果遇到另一个警卫,当前警卫就不看了,让这个新遇到的警卫再看下去) 该方向就停止遍历。

时间复杂度: O ( m ∗ n ) O(m*n) O(mn)

C++代码:

int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};
class Solution {
public:
    int countUnguarded(int m, int n, vector<vector<int>>& guards, vector<vector<int>>& walls) {
        //建表
        vector<vector<int>> g(m,vector<int>(n));

        for(auto &e:walls) g[e[0]][e[1]] = -1;
        for(auto &e:guards) g[e[0]][e[1]] = 2;

        for(auto &e:guards){
            int x = e[0],y = e[1];
            //从上下左右 四个方向遍历
            for(int i = 0;i < 4;i++){
                int nx = x + dx[i],ny = y + dy[i];
                //如果越界 或者 当前位置是墙 或者 当前位置是警卫 都停止遍历
                while(nx >= 0 && nx < m && ny >= 0 && ny < n && g[nx][ny] != 2 && g[nx][ny] != -1){
                    g[nx][ny] = 1;
                    nx += dx[i];
                    ny += dy[i];
                }
            }
        }

        int ans = 0;
        //最后统计没有被警卫守卫的点 即 g[i][j] == 0 的点
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(g[i][j] == 0) ans++;
            } 
        }
        return ans;
    }
};

Java代码:

class Solution {
    int[] dx = {1,0,-1,0};
    int[] dy = {0,1,0,-1};
    public int countUnguarded(int m, int n, int[][] guards, int[][] walls) {
        int[][] g = new int[m][n];
        for(var e:walls) g[e[0]][e[1]] = -1;
        for(var e:guards) g[e[0]][e[1]] = 2;

        for(var e:guards){
            int x = e[0];
            int y = e[1];
            for(int i = 0;i < 4;i++){
                int nx = x + dx[i];
                int ny = y + dy[i];
                while(nx>=0 && nx<m && ny>=0 && ny<n && g[nx][ny]!=2 && g[nx][ny]!=-1){
                    g[nx][ny] = 1;
                    nx += dx[i];
                    ny += dy[i];
                } 
            }
        }

        int ans = 0;
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(g[i][j] == 0) ans++;
            }
        }
        return ans;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

适合初学者的超详细实用调试技巧(下)

我们日常写代码的时候&#xff0c;常常会遇到bug的情况&#xff0c;这个时候像我这样的初学者就会像无头苍蝇一样这里改改那里删删&#xff0c;调试的重要性也就显现出来&#xff0c;这篇文章接着上文来讲解。 上文地址&#xff1a;(8条消息) 适合初学者的超详细实用调试技巧&…

Tomcat目录介绍,结构目录有哪些?哪些常用?

bin 启动&#xff0c;关闭和其他脚本。这些 .sh文件&#xff08;对于Unix系统&#xff09;是这些.bat文件的功能副本&#xff08;对于Windows系统&#xff09;。由于Win32命令行缺少某些功能&#xff0c;因此此处包含一些其他文件。 比如说&#xff1a;windows下启动tomcat用的…

3款强大到离谱的电脑软件,个个提效神器,从此远离加班

推荐3款让你偷懒&#xff0c;让你上头的提效电脑软件&#xff0c;个个功能强大&#xff0c;让你远离加班&#xff01; 很多几个小时才能做好的事情&#xff0c;用上它们&#xff0c;只需要5分钟就行&#xff01;&#xff01; 1、JNPF —— 个人最喜欢的低代码软件 它为开发者…

利用OpenCV的函数equalizeHist()对图像作直方图均衡化处理

如果一幅图像的灰度值集中在某个比较窄的区域&#xff0c;则图像的对比度会显得比较小&#xff0c;不便于对图像的分析和处理。 图像的直方图均衡化可以实现将原图像的灰度值范围扩大&#xff0c;这样图像的对比度就得到了提高&#xff0c;从而方便对图像进行后续的分析和处理…

从Docker挂载逃逸原理复现分析到BlueMoon实战

Docker逃逸 什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互…

Elasticsearch:在满意度调查中实现并使用情绪分析器

如果你通过博客或新闻关注 Elastic&#xff0c;你已经知道在最新版本的 Elasticsearch 中已经提供了用于自然语言处理 (NLP) 的资源。事实上&#xff0c;在我之前的博客文章中&#xff0c;我已经推出了很多关于 NLP 的博文。请详细阅读 “Elastic&#xff1a;开发者上手指南” …

【Linux 多线程同步】使用同步和互斥实现生产消费模型

目录 1.同步的接口 2.多线程但是按顺序来执行 3.生产消费模型 4.使用互斥加同步实现生产消费模型 &#xff08;采用环形队列&#xff09; 同步&#xff1a;在保证数据安全的前提下&#xff0c;让线程能够按照某种特定的顺序访问临界资源&#xff0c;从而有效避免饥饿问题 …

GraphTrip论文笔记【Information Fusion 92 (2023)】

Dual-grained human mobility learning for location-aware trip recommendation with spatial–temporal graph knowledge fusion 期刊&#xff1a;EI检索 Information Fusion 92 (2023) Challenges &#xff08;1&#xff09;异质交互信息的挖掘 POI位置信息、POI类别信息…

重新标记ImageNet:从全局标签到局部标签(附github代码及论文)

欢迎关注“计算机视觉研究院”计算机视觉研究院专栏作者&#xff1a;Edison_GImageNet可以说是最受欢迎的图像分类基准&#xff0c;但它也是一个具有显著噪声的标签。最近的研究表明&#xff0c;许多样本包含多个类&#xff0c;尽管被假定为单个标签基准。因此&#xff0c;他们…

【办公类-18-02】Python VScode 制作“照片整理.py”的exe文件(打包系列)

效果展示&#xff1a;背景需求&#xff1a;最近一年我都是机动班&#xff08;非固定班主任&#xff09;&#xff0c;所以拍的照片不多&#xff0c;只需要每月把手机里的照片用QQ的“我的文件助手”导出来&#xff0c;然后打开VScode&#xff0c;找到“20211020按日期批量整理文…

独居老人一键式报警器

盾王居家养老一键式报警系统&#xff0c;居家养老一键式报警设备 &#xff0c;一键通紧急呼救设备&#xff0c;一键通紧急呼救系统&#xff0c;一键通紧急呼救器 &#xff0c;一键通紧急呼救终端&#xff0c;一键通紧急呼救主机终端产品简介&#xff1a; 老人呼叫系统主要应用于…

java网络编程-nio学习:阻塞和非阻塞

一、阻塞 阻塞模式下&#xff0c;相关方法都会导致线程暂停 ServerSocketChannel.accept 会在没有连接建立时让线程暂停 SocketChannel.read 会在没有数据可读时让线程暂停 阻塞的表现其实就是线程暂停了&#xff0c;暂停期间不会占用 cpu&#xff0c;但线程相当于闲置 单线…

Learning C++ No.11【string类实现】

引言&#xff1a; 北京时间&#xff1a;2023/2/19/8:48&#xff0c;昨天更新了有关进程状态的博客&#xff0c;然后在休息的时候&#xff0c;打开了腾讯视屏&#xff0c;然后看到了了一个电视剧&#xff0c;导致上头&#xff0c;从晚上6点看到了10点&#xff0c;把我宝贵的博客…

vue(5)

文章目录1. 监测数据原理1.1 通过问题引出1.2 开始1.3 Vue.set() 方法1.4 vue 监视 数组1.5 小练习2. 收集表数据3. 过滤器4. 内置指令4.1 v-text4.2 v-html4.3 v-cloak4.4 v-once4.5 v-pre1. 监测数据原理 1.1 通过问题引出 1.2 开始 要想解决上面的这个问题 &#xff0c;需要…

python基于django幼儿园管理系统

目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2.1 JAVA简介 4 2.2MyEclipse环境配置 4 2.3 B/S结构简介 4 2.4MySQL数据库 5 2.5 SPRINGBOOT框架 5 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3…

【2022.12.9】Lammps+Python 在计算g6(r)时遇到的问题

目录写在前面绘制g6( r )执行步骤【updated】如何检查图像的正确性&#xff1a;不是编程问题&#xff0c;而是数学问题的一个小bug废稿2则&#xff1a;写在前面 全部log&#xff1a; 【2022.11.16】LammpsPythonMATLAB在绘制维诺图时遇到的问题 绘制g6( r )执行步骤【updated…

Eureka原理浅析

文章目录1.简介2.组件2.1 Eureka Server2.1.1 主要功能2.1.2 自我保护机制2.1.3 数据同步方式2.1.4 Server的多级缓存和Client实例过期策略2.2 Eureka Client3.补充3.1 CAP偏重点3.2 功能扩展性3.3 工作流程1.简介 Eureka是Netflix开发的服务发现框架&#xff0c;本身是基于RE…

SegNeXt: 重新思考基于卷积注意力的语义分割

论文信息 论文名称&#xff1a;SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation 项目GitHub&#xff1a; GitHub - Visual-Attention-Network/SegNeXt: Official Pytorch implementations for "SegNeXt: Rethinking Convolutional Atten…

ESP-C3入门11. 创建最基本的HTTP请求

ESP-C3入门11. 创建最基本的HTTP请求一、menuconfig配置二、配置 CMakeLists1. 设置项目的额外组件目录2. 设置头文件搜索目录三、在 ESP32 上执行 HTTP 请求的基本步骤1. 创建 TCP 连接2. 设置 HTTP 请求3. 发送 HTTP 请求4. 接收 HTTP 响应5. 处理 HTTP 响应6. 关闭 TCP 连接…

35岁以上的大龄测试员们,后来都干什么去了?

为什么软件测试行业看不见白发苍苍的软件测试员?大龄测试员都去哪里了?各个公司会辞退大龄测试员吗? 如果一位 50 多岁的测试员申请 20 多岁或 30 多岁的职位&#xff0c;有多少公司会雇用他们呢?关于这个问题&#xff0c;有很多流言传说&#xff0c;也有一些残酷的现实。…