目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
题目顾名思义,要我们统计参与通信的服务器,给我们一个二维矩阵,元素为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;
}
};