Leetcode의 일일 질문 : 1267. 통신에 참여하는 서버의 통계

원래 제목

다음은 서버 분포 맵입니다. 서버의 위치는  m * n 정수 매트릭스 그리드  로 표시됩니다 grid . 1은 셀에 서버가 있음을 의미하고 0은 서버가 없음을 의미합니다.

두 서버가 동일한 행이나 열에 있으면 서로 통신할 수 있다고 가정합니다.

하나 이상의 다른 서버와 통신할 수 있는 서버 수를 세어 반환해 주세요.

예시 1:

입력: 그리드 = [[1,0],[0,1]]
 출력: 0
 설명: 어떤 서버도 다른 서버와 통신할 수 없습니다.

예 2:

입력: Grid = [[1,0],[1,1]]
 출력: 3
 설명: 이러한 모든 서버는 적어도 하나의 다른 서버와 통신할 수 있습니다.

예시 3:

입력: 그리드 = [[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

출처 : LeetCode 공식 홈페이지 - 전 세계 괴짜들이 사랑하는 기술 성장 플랫폼

문제 해결 아이디어

질문을 이해한 후에는 질문에서 행과 열의 2보다 크거나 같은 각 행과 열의 1 수를 세어야 한다는 것을 알게 될 것입니다. 문제를 해결하는 간단한 방법은 각 행과 열에 있는 1의 개수를 세고, 값 1로 각 지점을 순회하여 행과 열에 있는 1의 개수가 2보다 크거나 같은지 확인하는 것입니다. 따라서 우리는 공식 솔루션을 구현합니다.

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;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/count-servers-that-communicate/solutions/101819/tong-ji-can-yu-tong-xin-de-fu-wu-qi-by-leetcode-so/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

최적화 문제 해결

공식 솔루션에서는 모든 지점을 두 번 통과해야 하는데 최적화할 여지가 있나요? 실제로 각 행을 순회할 때 행에 있는 1의 수가 2보다 크거나 같으면 모두 결과와 일치하는 포인트입니다. 정확히 1과 같으면 이 열의 1 포인트 수가 2보다 크거나 같은지 나중에 확인해야 합니다. 따라서 이를 먼저 수집하고 최종적으로 판단하면 두 번째 라운드의 시간 복잡도를 O(n)으로 줄일 수 있습니다. 이 아이디어를 바탕으로 최적화된 버전은 다음과 같습니다.

class Solution {
public:
    int countServers(vector<vector<int>>& grid) {
        int m = grid.size();
        int n = grid[0].size();
        unordered_map<int, int> cols;
        int ans = 0,col = 0, rows=0;
        vector<int> srows;
        for(int i = 0; i < m;i++){
            rows=0;
            for(int j =0;j< n;j++){
                if(grid[i][j] == 1){
                    ++rows;
                    ++cols[j];
                    col = j;
                }
            }
            if(rows >= 2){
                ans+=rows;
            }else if(rows == 1){
                srows.emplace_back(col);
            }
        }
        for(int &j:srows){
            if(cols[j]>=2){
                ++ans;
            }
        }
        return ans;
    }
};

추천

출처blog.csdn.net/Mamong/article/details/132472997