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

相关推荐
淡水猫.32 分钟前
hbit资产收集工具Docker(笔记版)
运维·docker·容器
xixixin_1 小时前
【Vite】前端开发服务器的配置
服务器·前端·网络
.生产的驴2 小时前
Vue3 加快页面加载速度 使用CDN外部库的加载 提升页面打开速度 服务器分发
运维·服务器·前端·vue.js·分布式·前端框架·vue
程序员JerrySUN2 小时前
Linux 内核核心知识热点题分析:10 个连环打通的难点
linux·运维·服务器
再睡一夏就好3 小时前
从硬件角度理解“Linux下一切皆文件“,详解用户级缓冲区
linux·服务器·c语言·开发语言·学习笔记
zm4 小时前
TCP 粘包
服务器·网络·php
honey ball7 小时前
R & S的EMI接收机面板
linux·运维·网络
木下-俱欢颜8 小时前
搭建基于chrony+OpenSSL(NTS协议)多层级可信时间同步服务
运维·网络安全·udp·ssl
旧故新长9 小时前
访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时
运维·docker·容器
GBXLUO9 小时前
如何使用远程桌面控制电脑
服务器