1267. 统计参与通信的服务器
大约 3 分钟
--- 

1267. 统计参与通信的服务器
- 标签:深度优先搜索、广度优先搜索、并查集、数组、计数、矩阵
- 难度:中等
题目链接
题目大意
描述:这里有一幅服务器分布图,服务器的位置标识在 的整数矩阵网格 中, 表示单元格上有服务器, 表示没有。如果两台服务器位于同一行或者同一列,就认为它们之间可以进行通信。
要求:统计并返回能够与至少一台其他服务器进行通信的服务器的数量。
说明:
- 。
- 。
- 。
- 。
- or 。
示例:
- 示例 1:

输入:grid = [[1,0],[0,1]]
输出:0
解释:没有一台服务器能与其他服务器进行通信。- 示例 2:

输入:grid = [[1,0],[1,1]]
输出:3
解释:所有这些服务器都至少可以与一台别的服务器进行通信。解题思路
思路 1:行列计数
1. 核心思想
一台服务器能通信的条件非常直观:它所在的行或列上至少还有另一台服务器。因为通信只要求同行或同列,不要求相邻。
所以不需要复杂的图遍历或并查集。我们只需要两趟扫描:
- 第一趟:统计每行和每列分别有多少台服务器。
- 第二趟:对每个服务器,检查它所在行或列的服务器数量是否大于 。
2. 具体步骤
第 1 步:统计行列服务器数量
获取矩阵的行数 和列数 。创建两个数组 和 ,长度分别为 和 ,初始全为 。
遍历整个矩阵,当遇到 时:
- (第 行多了一台服务器)
- (第 列多了一台服务器)
第 2 步:统计可通信服务器
再次遍历整个矩阵,当遇到 时,检查 或 。只要满足任意一个,说明该服务器至少有一台同行或同列的服务器,计数加 。
第 3 步:返回计数
结合示例走一遍:
示例 1:
统计行列:
检查:两个服务器各自的行和列都只有它自己( 且 ),都无法通信。返回 。
示例 2:
统计行列:
- :
- :
- :
检查:
- : 且 → 可通信 ✓
- : → 可通信 ✓
- : → 可通信 ✓
返回 。
思路 1:代码
class Solution:
def countServers(self, grid: List[List[int]]) -> int:
m, n = len(grid), len(grid[0])
# 第 1 步:统计每行和每列的服务器数量
rows = [0] * m
cols = [0] * n
for i in range(m):
for j in range(n):
if grid[i][j] == 1:
rows[i] += 1
cols[j] += 1
# 第 2 步:检查每个服务器能否通信
ans = 0
for i in range(m):
for j in range(n):
if grid[i][j] == 1 and (rows[i] > 1 or cols[j] > 1):
ans += 1
return ans思路 1:复杂度分析
- 时间复杂度:,需要遍历整个矩阵两次(一次统计,一次检查),每次遍历都是 。
- 空间复杂度:,需要两个数组分别存储 行的计数和 列的计数。