【每日一题】1267. 统计参与通信的服务器

【每日一题】1267. 统计参与通信的服务器

1267. 统计参与通信的服务器

题目描述

这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。

如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。

请你统计并返回能够与至少一台其他服务器进行通信的服务器的数量。

示例 1:

复制代码
输入:grid = [[1,0],[0,1]]
输出:0
解释:没有一台服务器能与其他服务器进行通信。

示例 2:

复制代码
输入:grid = [[1,0],[1,1]]
输出:3
解释:所有这些服务器都至少可以与一台别的服务器进行通信。

示例 3:

复制代码
输入:grid = [[1,1,0,0],[0,0,1,0],[0,0,1,0],[0,0,0,1]]
输出:4
解释:第一行的两台服务器互相通信,第三列的两台服务器互相通信,但右下角的服务器无法与其他服务器通信。

提示:

m == grid.length

n == grid[i].length

1 <= m <= 250

1 <= n <= 250

grid[i][j] == 0 or 1

解题思路

思路:如果直接遍历二维数组时再分别对每一项分别遍历行或者列进而判断是否能够参与通信的时间复杂度较高,故此时选择对于是否能够参与通信进行预处理,即分别使用行数组row存储每一行是否能够参与通信、使用列数组col存储每一列是否能够参与通信,其中每一行或者每一列是否能够参与通信的条件是为1的数量大于等于2。

复制代码
class Solution {
public:
    int countServers(vector<vector<int>>& grid) {
        // 数据预处理
        int m=grid.size();
        int n=grid[0].size();
        // 分别统计行和列
        vector<bool> row(m,false);
        vector<bool> col(n,false);
        // 遍历gird 统计行
        for(int i=0;i<m;i++)
        {
            // 记录每行数量
            int num=0;
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==1)
                    num++;
            }
            if(num>=2)
            row[i]=true;
        }
        // 遍历gird 统计列
        for(int i=0;i<n;i++)
        {
            // 记录每列数量
            int num=0;
            for(int j=0;j<m;j++)
            {
                if(grid[j][i]==1)
                    num++;
            }
            if(num>=2)
            col[i]=true;
        }
        int res=0;
        // 遍历grid
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==1&&(row[i]||col[j]))
                    res++;
            }
        }
        return res;
    }
};

class Solution {
public:
    int countServers(vector<vector<int>>& grid) {
        // 数据预处理
        int m=grid.size();
        int n=grid[0].size();
        // 分别统计行和列
        vector<int> row(m,0);
        vector<int> col(n,0);
        // 遍历gird 统计行
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==1)
                {
                    row[i]++;
                    col[j]++;
                }
            }
        }
        int res=0;
        // 遍历grid
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(grid[i][j]==1&&(row[i]>=2||col[j]>=2))
                    res++;
            }
        }
        return res;
    }
};

总结:第一次使用的数组是bool类型,这样需要三次遍历;第二次使用的数组是int类型,这样只需要两次遍历。

相关推荐
YuMiao17 小时前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
碳基沙盒2 天前
OpenClaw 多 Agent 配置实战指南
运维
Sinclair3 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
Rockbean4 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
蝎子莱莱爱打怪5 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
茶杯梦轩5 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试
海天鹰5 天前
【免费】PHP主机=域名+解析+主机
服务器
DianSan_ERP5 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
呉師傅5 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒5 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器