力扣73. 矩阵置零(哈希记录0出现的行列标号)

力扣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";
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值