#include <iostream>
#include <map>
#include <vector>
using namespace std;
class Solutions
{
public:
void setZeroes(vector<vector<int>> &matrix) {
int n = matrix.size();
int m = matrix[0].size();
int col0 = 1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (matrix[i][j] == 0) {
if (j==0) {
col0 = 0;
} else {
matrix[0][j] = 0;
}
matrix[i][0] = 0;
}
}
}
for (int i = 1; i < n; i++)
{
for (int j = 1; j < m; j++)
{
if (matrix[i][j] != 0) {
if (matrix[0][j] == 0 || matrix[i][0] == 0) {
matrix[i][j] = 0;
}
}
}
}
if (matrix[0][0] == 0){
for (int j=0; j<m; j++) {
matrix[0][j] = 0;
}
}
if (col0 == 0) {
for (int i = 0; i < n; i++) {
matrix[i][0] = 0;
}
}
}
void setZeroesBetter(vector<vector<int>> &matrix) {
int n = matrix.size();
int m = matrix[0].size();
map<int, int> row;
map<int, int> col;
for (int i = 0; i <n; i++)
{
for (int j = 0; j <m; j++) {
if (matrix[i][j] == 0) {
col[j] = 1;
row[i] = 1;
}
}
}
for (int i = 0; i <n; i++)
{
for (int j = 0; j <m; j++) {
if (col[j] == 1 || row[i] == 1) {
matrix[i][j] = 0;
}
}
}
}
void setZeroesBrute(vector<vector<int>> &matrix)
{
vector<vector<int>> matrixCopy;
int rowSize = matrix.size();
for (int i = 0; i < rowSize; i++)
{
matrixCopy.push_back(matrix[i]);
}
for (int i = 0; i < matrix.size(); i++)
{
for (int j = 0; j < matrix[i].size(); j++)
{
if (matrix[i][j] == 0) {
markRow(i, matrix, matrixCopy);
markColumn(j, matrix, matrixCopy);
}
}
}
for (int i = 0; i < matrixCopy.size(); i++)
{
for (int j = 0; j < matrixCopy[i].size(); j++)
{
if (matrixCopy[i][j] == 0) {
matrix[i][j] = 0;
}
}
}
}
void markRow(int i, vector<vector<int>> &matrix, vector<vector<int>> &matrixCopy) {
int colSize = matrix[0].size();
for (int j = 0; j < colSize; j++)
{
if (matrix[i][j]!=0) {
matrixCopy[i][j] = 0;
}
}
}
void markColumn(int j, vector<vector<int>> &matrix, vector<vector<int>> &matrixCopy) {
int rowSize = matrix.size();
for (int i = 0; i < rowSize ; i++)
{
if (matrix[i][j]!=0) {
matrixCopy[i][j] = 0;
}
}
}
void print(vector<vector<int>> &matrix) {
int rowSize = matrix.size();
for (int i = 0; i < rowSize; i++)
{
int colSize = matrix[i].size();
for (int j = 0; j < colSize; j++)
{
cout << matrix[i][j] << "\t";
}
cout << "\n";
}
}
};
int main()
{
Solutions *sl = new Solutions();
vector<vector<int>> matrix{{0,1,2,0},
{3,4,5,2},
{1,3,1,5}};
sl->setZeroes(matrix);
sl->print(matrix);
return 0;
}