JZX轻语:简

LeetCode 1267 - 统计参与通信的服务器

发表于2024年07月15日

#矩阵 #哈希表

本质就是找到一组服务器,其中每个服务器至少和另一个服务器处在同一行或同一列中。一开始想用的是并查集,但不用那么复杂。有两种方法,第一种也是官解的做法,即两次遍历+哈希表的做法,首先第一次遍历用于统计每一行和每一列的服务器数量,第二次遍历则检查服务器对应的行和列是否有其他服务器,如果有,则计数;

第二种方法也是遍历两次,但第二次遍历仅需遍历行即可,使用的是逆向思维:统计落单的服务器个数,最后结果即为总服务器数减去落单的服务器数。首先第一次遍历统计所有的服务器数量、每一列的服务器数量以及每一行中仅有一个服务器的情况下,该服务器的所在列,第二次则遍历每一行,如果该行中仅有一个服务器,且该服务器所在列的服务器数量为1,则该服务器为落单服务器。

class Solution:
    def countServers(self, grid: List[List[int]]) -> int:
        m, n = len(grid), len(grid[0])
        col_cnt = [0] * n  # 记录每一列中服务器的数量
        row_to_unique_col = [-1] * m  # 记录每一行中唯一的服务器所在列, 如果没有服务器或者有多个服务器,则为-1
        all_server_cnt = 0
        for i in range(m):
            last_server_col = -1
            row_server_cnt = 0
            for j in range(n):
                if grid[i][j] == 1:
                    all_server_cnt += 1
                    col_cnt[j] += 1
                    row_server_cnt += 1
                    last_server_col = j
            if row_server_cnt == 1:  # 该行中仅有一个服务器, 记录其所在列
                row_to_unique_col[i] = last_server_col
        single_server_cnt = 0  # 落单的服务器个数
        for i in range(m):
            single_server_cnt += (row_to_unique_col[i] != -1 and col_cnt[row_to_unique_col[i]] == 1)
        return all_server_cnt - single_server_cnt

闪念标签:LC

题目链接:https://leetcode.cn/problems/count-servers-that-communicate/