题目:
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
C++:
思路:
可以使用两个数组来记录哪些行和列需要被置零。
首先,我们遍历整个矩阵,如果一个元素为0,我们就将其所在的行和列分别标记为需要被置零的行和列。
然后,我们再次遍历整个矩阵,如果一个元素所在的行或列被标记为需要被置零的行或列,我们就将该元素置零。
//数量的行(的std::vector<int>包含在vec数):vec.size()
//列数(包含在每个元素的数量std::vector<int>):vec[0].size()
//元素总数:vec.size()*vec[0].size()#include <iostream>
#include <vector>
#include <algorithm>using namespace std;class Solution
{
public:void Setzero(vector<vector<int>>& matrix){int m = matrix.size();int n = matrix[0].size();if (n == 0 && m == 0)return;vector<int> rows(m, 0); // 创建一个大小为m的vector,并将每个元素初始化为0。vector<int> cols(n, 0); // 创建一个大小为n的vector,并将每个元素初始化为0。for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if (matrix[i][j] == 0){rows[i] = 1;cols[j] = 1;}}}for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if (rows[i] == 1 || cols[j] == 1){matrix[i][j] = 0;}cout << matrix[i][j] << endl;}}}
};int main()
{vector<vector<int>> matrix = { { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 } };Solution S;S.Setzero(matrix);
}
python:
思路:两遍扫matrix,第一遍用集合记录哪些行,哪些列有0;第二遍置0
class Solution:def setZeroes(self, matrix):"""Do not return anything, modify matrix in-place instead."""row = len(matrix)col = len(matrix[0])# set():创建空集合row_zero = set()col_zero = set()for i in range(row):for j in range(col):if matrix[i][j] == 0:row_zero.add(i)col_zero.add(j)for i in range(row):for j in range(col):if i in row_zero or j in col_zero:matrix[i][j] = 0