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

相关推荐
前端世界4 小时前
从零搭建多子网 DHCP 服务:CentOS 双网卡多作用域实战与原理解析
linux·运维·centos
头发那是一根不剩了4 小时前
Docker Desktop 安装教程和最佳实践
运维·docker·容器
路由侠内网穿透.5 小时前
本地部署轻量级持续集成工具 Drone CI 并实现外部访问
运维·服务器·ci/cd·远程工作
节点小宝6 小时前
节点小宝与中兴路由合作升级:AX5400系列新增远程控网功能
服务器·网络·安全·智能路由器·远程工作
tianyuanwo6 小时前
K8s Dashboard运维技巧全面经验总结
linux·运维·kubernetes
无敌的牛7 小时前
Linux操作系统
linux·运维·服务器
半梦半醒*7 小时前
k8s——services资源+pod详解1
linux·运维·docker·kubernetes·centos·负载均衡
IndulgeCui7 小时前
【金仓数据库产品体验官】KSQL Developer Linux版安装使用体验
linux·运维·数据库
半旧夜夏7 小时前
【分布式缓存】Redis持久化和集群部署攻略
java·运维·redis·分布式·缓存
苹果醋38 小时前
element-ui源码阅读-样式
java·运维·spring boot·mysql·nginx