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

来源:力扣(LeetCode)

描述:

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

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • m == grid.length
  • n == gridi.length
  • 1 <= m <= 250
  • 1 <= n <= 250
  • gridij == 0 or 1

方法:两次遍历 + 哈希表

思路与算法

我们可以使用两次遍历解决本题。

在第一次遍历中,我们遍历数组 grid,如果 gridi, j 的值为 1,说明位置 (i, j) 有一台服务器,我们可以将第 i 行服务器的数量,以及第 j 行服务器的数量,均加上 1。为了维护行列中服务器的数量,我们可以使用两个哈希映射 row 和 col,row 中存储行的编号以及每一行服务器的数量,col 存储列的编号以及每一列服务器的数量。

在第二次遍历中,我们就可以根据 row 和 col 来判断每一台服务器是否能与至少其它一台服务器进行通信了。如果 grid(i, j) 的值为 1,并且 rowi 和 colj 中至少有一个严格大于 1,就说明位置 (i, j) 的服务器能与同一行或者同一列的另一台服务器进行通信,答案加 1。

代码:

cpp 复制代码
class Solution {
public:
    int countServers(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        unordered_map<int, int> rows, cols;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 1) {
                    ++rows[i];
                    ++cols[j];
                }
            }
        }
        int ans = 0;
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 1 && (rows[i] > 1 || cols[j] > 1)) {
                    ++ans;
                }
            }
        }
        return ans;
    }
};

时间 48ms 击败 66.06%使用 C++ 的用户

内存 21.43MB 击败 23.03%使用 C++ 的用户
复杂度分析

  • 时间复杂度:O(mn)。
  • 空间复杂度:O(m+n),即为哈希映射需要使用的空间。
    author:力扣官方题解
相关推荐
程序猿编码7 分钟前
用C++从零开始造一个微型GPT,不借助任何第三方库
开发语言·c++·gpt·模型推理
qz5zwangzihan144 分钟前
题解:Atcoder Beginner Contest abc466 F - Many Mod Calculation
c++·题解·优先队列·atcoder·大根堆·abc466·abc466f
froyoisle1 小时前
CSP 真题解析:[CSP-J 2019-T4] 加工零件
c++·算法·bfs·csp-j·算法竞赛·信息学·信奥赛
LuminousCPP1 小时前
C 语言集中实践全记录:顺序表 + 单链表原理实现与通讯录项目实战【附可运行源码】
c语言·开发语言·数据结构·经验分享·笔记
2401_869769591 小时前
内容7 内存管理 1
c++
兰令水1 小时前
hot100【acm版】【2026.7.13打卡-java版本】
java·开发语言·数据结构·算法·leetcode·面试
Tisfy1 小时前
LeetCode 1291.顺次数:打表/枚举
算法·leetcode·题解·枚举·遍历
ysa0510302 小时前
【板子】拓扑排序
c++·算法·图论·板子
某不知名網友2 小时前
项目:轻量级搜索引擎
c++
罗超驿3 小时前
双指针算法详解:从入门到精通(Java版)
算法·leetcode·职场和发展