【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:力扣官方题解
相关推荐
近津薪荼15 分钟前
c++详解(宏与内联函数,nullptr)
开发语言·c++
淮北4941 小时前
STL学习(十一、常用的算数算法和集合算法)
c++·vscode·学习·算法
摸鱼仙人~1 小时前
Redis 数据结构全景解析
数据结构·数据库·redis
AA陈超3 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 #06-11:游戏后效果执行
c++·游戏·ue5·游戏引擎·虚幻
小学生的信奥之路7 小时前
力扣1116题:用C++实现多线程交替输出零、偶数、奇数
c++·leetcode·多线程
老狼主8 小时前
MFC CChartCtrl编程
c++·mfc
玄月初二丶8 小时前
28. 找出字符串中第一个匹配项的下标
c语言·开发语言·数据结构·算法
新青年.8 小时前
cpp实现音频重采样8k->16k及16k->8k
c++
金山几座9 小时前
C++面试5题--6day
c++·面试
筏.k9 小时前
知识随记-----使用现代C++客户端库redis-plus-plus实现redis池缓解高并发
c++·经验分享·redis·microsoft