1582. 二进制矩阵中的特殊位置
图床:blogimg/刷题记录/leetcode/1582/
刷题代码汇总:https://www.cnblogs.com/geaming/p/16428234.html
题目
思路
先对每行进行遍历,如果这行的和大于1便可以进入下一行,如果和等于1,记录元素为1的下标,对其所在行进行判断。
预处理。
解法
class Solution {
public:
int numSpecial(vector<vector<int>>& mat) {
int ans = 0;
for(int i = 0;i<mat.size();i++){
int tmp = -1;
int count = 0;
for(int j = 0;j<mat[0].size();j++){
if(mat[i][j]==1&&count==0){
tmp = j;
count = 1;
}
else if(mat[i][j]==1&&count==1){
tmp = -1;
break;
}
}
count = 0;
if(tmp!=-1){
for(int j = 0;j<mat.size();j++){
if(mat[j][tmp]==1){
count++;
}
}
if(count==1)
ans++;
}
}
return ans;
}
};
- 时间复杂度:\(O(m\times n)\),
- 空间复杂度:\(O(1)\)
预处理
class Solution {
public:
int numSpecial(vector<vector<int>>& mat) {
int ans = 0;
vector<int> row_sum(mat.size()),col_sum(mat[0].size());
for(int i =0;i<mat.size();i++){
for(int j =0;j<mat[0].size();j++){
row_sum[i]+=mat[i][j];
col_sum[j]+=mat[i][j];
}
}
for(int i =0;i<mat.size();i++){
for(int j =0;j<mat[0].size();j++)
ans += (row_sum[i]==1&&col_sum[j]==1&&mat[i][j]==1)?1:0;
}
return ans;
}
};