【每日一题】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类型,这样只需要两次遍历。

相关推荐
可可嘻嘻大老虎5 小时前
nginx无法访问后端服务问题
运维·nginx
阳光九叶草LXGZXJ6 小时前
达梦数据库-学习-47-DmDrs控制台命令(LSN、启停、装载)
linux·运维·数据库·sql·学习
无忧智库6 小时前
某市“十五五“地下综合管廊智能化运维管理平台建设全案解析:从数字孪生到信创适配的深度实践(WORD)
运维·智慧城市
珠海西格7 小时前
“主动预防” vs “事后补救”:分布式光伏防逆流技术的代际革命,西格电力给出标准答案
大数据·运维·服务器·分布式·云计算·能源
阿波罗尼亚7 小时前
Kubectl 命令记录
linux·运维·服务器
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.7 小时前
Keepalived单播模式配置与实战指南
linux·服务器·负载均衡
IDC02_FEIYA8 小时前
Linux文件搜索命令有哪些?Linux常用命令之文件搜索命令find详解
linux·运维·服务器
犀思云8 小时前
如何通过网络即服务平台实现企业数字化转型?
运维·网络·人工智能·系统架构·机器人
江畔何人初8 小时前
kubectl apply与kubectl create的区别
linux·运维·云原生
M158227690558 小时前
四通道全能组网!SG-Canet-410 CAN转以太网网关,破解工业CAN通信瓶颈
linux·运维·服务器