题目大意:给定一个矩阵 如果矩阵中出现元素0 则元素所在的行和列都被清空为0
Emmmm 本题算法很简单,所以采用std::multimap 目的是熟悉这个容器
算法当然不是很快。。。毕竟O(n3)
/*
* @lc app=leetcode id=73 lang=cpp
*
* [73] Set Matrix Zeroes
*
* https://leetcode.com/problems/set-matrix-zeroes/description/
*
* algorithms
* Medium (38.55%)
* Total Accepted: 181.9K
* Total Submissions: 471.9K
* Testcase Example: '[[1,1,1],[1,0,1],[1,1,1]]'
*
* Given a m x n matrix, if an element is 0, set its entire row and column to
* 0. Do it in-place.
*
* Example 1:
*
*
* Input:
* [
* [1,1,1],
* [1,0,1],
* [1,1,1]
* ]
* Output:
* [
* [1,0,1],
* [0,0,0],
* [1,0,1]
* ]
*
*
* Example 2:
*
*
* Input:
* [
* [0,1,2,0],
* [3,4,5,2],
* [1,3,1,5]
* ]
* Output:
* [
* [0,0,0,0],
* [0,4,5,0],
* [0,3,1,0]
* ]
*
*
* Follow up:
*
*
* A straight forward solution using O(mn) space is probably a bad idea.
* A simple improvement uses O(m + n) space, but still not the best
* solution.
* Could you devise a constant space solution?
*
*
*/
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
multimap<int, int> m;
if (matrix.size() == 0 || matrix[0].size() == 0) {
return;
}
for (size_t j = 0; j < matrix[0].size(); ++j) {
for (size_t i = 0; i < matrix.size(); ++i) {
if (matrix[i][j] == 0) {
m.insert({j, i});
}
}
}
for (size_t j = 0; j < matrix[0].size(); ++j) {
// j列元素有几个是0
if (m.count(j)) {
//该列中的行的个数
size_t cnt = m.count(j);
//该列的第一个元素
auto iter = m.find(j);
while (cnt) {
//横着
for (int k = 0; k < matrix[0].size(); k++) {
matrix[iter->second][k] = 0;
}
iter++;
cnt--;
}
//对j列清空为0 竖着
for (size_t i = 0; i < matrix.size(); ++i) {
matrix[i][j] = 0;
}
}
}
return;
}
};