力扣73. 矩阵置零(哈希记录0出现的行列标号)
https://leetcode-cn.com/problems/set-matrix-zeroes/
哈希记录0出现的行列标号
算法思路:
1)设置两个数组hashi[矩阵行数]和hashj[家族很列数],均初始化为0;hashi[i]不为0表示矩阵第i行有0,同理hashj[j]不为0表示矩阵第j行有0。
2)遍历矩阵,当[i][j]为0时,hashi[i]=1, hashj[j]=1。
3)遍历hashi,若hashi[i]不为0,将矩阵第i行循环置零;
4)遍历hashj,若hashj[j]不为0,将矩阵第j列循环置零;
算法性能分析:
时间复杂度:第1)步,时间开销为a(N+M);第2)步时间开销最小最大均为bNM,第3)步时间最大开销为cNM,最小开销为cN;第4)步时间最大开销为dNM,最小开销为dM。合计所以最坏复杂度为a(N+M)+bNM+cNM+dNM,最好复杂度为:a(N+M)+bN*M+cN+dM。其中a、b、c、d均为每一步的平均常数因子。可见算法稳定性较高。
空间复杂度:
最好最坏都是N+M,即θ(N+M)。
// 73setZeroes.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<vector>
#include<map>
using namespace std;
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
map<int, int>mprow;//行
map<int, int>mpcol;//列
for (int i = 0; i < matrix.size(); i++)
{
for (int j = 0; j < matrix[0].size(); j++)
{
if (matrix[i][j] == 0)
{
mprow[i] = 1;
mpcol[j] = 1;
}
}
}
//行变0
for (int i = 0; i < matrix.size(); i++)
{
if (mprow[i] == 1)
{
for (int j = 0; j < matrix[0].size(); j++)
{
matrix[i][j] = 0;
}
}
}
//列变0
for (int j = 0; j < matrix[0].size(); j++)
{
if (mpcol[j] == 1)
{
for (int i = 0; i < matrix.size(); i++)
{
matrix[i][j] = 0;
}
}
}
}
};
int main()
{
vector<vector<int>> matrix = { {0,1,2,0},{3,4,5,2},{1,3,1,5} };
for (int i = 0; i < matrix.size(); i++)
{
for (int j = 0; j < matrix[0].size(); j++)
{
cout << matrix[i][j] << " ";
}
cout << endl;
}
cout << endl;
cout << endl;
Solution s;
s.setZeroes(matrix);
for (int i = 0; i < matrix.size(); i++)
{
for (int j = 0; j < matrix[0].size(); j++)
{
cout << matrix[i][j] << " ";
}
cout << endl;
}
std::cout << "Hello World!\n";
}