【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 == grid[i].length
  • 1 <= m <= 250
  • 1 <= n <= 250
  • grid[i][j] == 0 or 1

方法:两次遍历 + 哈希表

思路与算法

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

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

在第二次遍历中,我们就可以根据 row 和 col 来判断每一台服务器是否能与至少其它一台服务器进行通信了。如果 grid(i, j) 的值为 1,并且 row[i] 和 col[j] 中至少有一个严格大于 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:力扣官方题解
相关推荐
南宫生26 分钟前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
发霉的闲鱼27 分钟前
MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
c++·mfc
小c君tt30 分钟前
MFC中Excel的导入以及使用步骤
c++·excel·mfc
xiaoxiao涛37 分钟前
协程6 --- HOOK
c++·协程
weixin_432702261 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
passer__jw7672 小时前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
爱吃生蚝的于勒3 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~3 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
星沁城3 小时前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德3 小时前
多项式加法——C语言
数据结构·c++·算法