题目:
分析:这道题的难点在于行列的统计可能出现重复。
我的解决方法是行的ok时变成0.
写的非常好,引入变量解决重复加的问题。
代码:
class Solution {
public:
int countServers(vector<vector<int>>& g) {
int A[255];
int B[255];
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
//vector<int> > g;
if(g.size()==0) return 0;
int all=0;
for(int i=0;i<g.size();i++)
{
int ok=0;
int c=0;
int t=-1;
for(int j=0;j<g[0].size();j++)
{
if(g[i][j]!=0)
{
if(ok==0)
{
ok=1;c=1;t=j;
}
else{
all++;
all+=c;
c=0;
A[t]=1;
A[j]=1;
g[i][j]=0;
g[i][t]=0;
}
}
}
}
//列
for(int i=0;i<g[0].size();i++)
{
int ok=A[i];
int c=0;
for(int j=0;j<g.size();j++)
{
if(ok==1)
{
if(g[j][i]==1) {
all++;
all+=c;
c=0;
}
}
else{
if(g[j][i]==1)
{
ok=1;
c=1;
}
}
}
}
return all;
}
};
2021.4.15:这么简答的题,怎么想的变成了精华呢?
统计有哪些行有两个以上,统计有哪些列有两个以上。
两轮遍历就ok,果断取消精华。
class Solution {
public:
int countServers(vector<vector<int>>& grid) {
if(grid.size()==0) return 0;
//首先统计行
vector<int> v1(grid.size(),0);
//然后统计列
vector<int> v2(grid[0].size(),0);
for(int i=0;i<grid.size();i++)
{
for(int j=0;j<grid[0].size();j++)
{
if(grid[i][j]) {
v1[i]++;
v2[j]++;
}
}
}
int ans=0;
for(int i=0;i<grid.size();i++)
{
for(int j=0;j<grid[0].size();j++)
{
if(grid[i][j]) {
if(v1[i]>=2||v2[j]>=2) ans++;
}
}
}
return ans;
}
};