【力扣每日一题】2023.8.24 统计参与通信的服务器

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目顾名思义,要我们统计参与通信的服务器,给我们一个二维矩阵,元素为1的位置则表示是一台服务器。

判断一台服务器是否参与通信的条件是同一列或是同一行中也有服务器。

那么我们只需要遍历整个矩阵,遇到服务器的时候我们进入一个判断,如果同一行或是同一列中也有服务器,那么我们就认为这台服务器是参与通信的服务器,最后将统计结果返回即可。

也就是说这道题纯暴力也能轻松通过,甚至运行时间还超过了86%

 这也和数据量比较小有关,矩阵不会超过250*250。

 

 如果数据量更大的情况,我们就可以进行一个优化,在遇到了同一列或是同一行的服务器时,我们将其位置修改为非1非0的值来表示这个位置是有服务器的,不过我们已经统计过了。这样在矩阵中遍历到这个位置时,就会因为这个位置的元素不为1而跳过,从而减少遍历次数。

不过在这数据量较小的情况下,因为需要一多些判断,所以运行速度反而更慢一些。

两种方法的代码可以参考下面。

代码:

class Solution {
public:
    //方法1
    bool check(vector<vector<int>>& grid,int i,int j){
        for(int ii=0;ii<grid.size();ii++){  //检查同一列
            if( grid[ii][j] == 1 && ii != i ) return true;
        }
        for(int jj=0;jj<grid[0].size();jj++){   //检查同一行
            if( grid[i][jj] == 1 && jj != j ) return true;
        }
        return false;
    }
    int countServers(vector<vector<int>>& grid) {
        int res=0;
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                if( grid[i][j] == 1 && check(grid,i,j)) res++;
            }
        }
        return res;
    }

    //方法2
    int res=0;
    void check1(vector<vector<int>>& grid,int i,int j){
        bool flag=false;
        for(int ii=0;ii<grid.size();ii++){  //检查同一列
            if( grid[ii][j] == 1 && ii != i ){
                flag=true;
                res++;
                grid[ii][j]=2;
            }
            if(grid[ii][j]==2) flag=true;
        }
        for(int jj=0;jj<grid[0].size();jj++){   //检查同一行
            if( grid[i][jj] == 1 && jj != j ){
                flag=true;
                res++;
                grid[i][jj]=2;
            }
            if(grid[i][jj]==2) flag=true;
        }
        if(flag) res++;
    }
    int countServers(vector<vector<int>>& grid) {
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[0].size();j++){
                if( grid[i][j] == 1 ) check1(grid,i,j);
            }
        }
        return res;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值