本题主要考察代码能力。
题目描述:
题号:73
给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
解题思路:
思路一:利用第一行第一列记录 0
算法思路:
1、用 2 个变量记录矩阵第 1 行、第 1 列有没有 0
2、遍历矩阵,如果遇到 0 则将其对应的第 1 行和第 1 列元素置 0
3、遍历矩阵,若元素对应的第 1 行 或 第 1 列元素为 0 则将其置 0
时间复杂度:O(N)
空间复杂度:O(1)
C++
// C++
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0) {
return;
}
int row = matrix.size();
int col = matrix[0].size();
// 分别记录第一行和第一列中有没有 0
bool colOneHas0 = false, rowOneHas0 = false;
for(int i = 0; i < row; i++) {
if(matrix[i][0] == 0) {
rowOneHas0 = true;
break;
}
}
for(int i = 0; i < col; i++) {
if(matrix[0][i] == 0) {
colOneHas0 = true;
break;
}
}
// 扫描每一个矩阵元素并标记在第一行和第一列
for(int i = 1; i < row; i++) {
for(int j = 1; j < col; j++) {
if(matrix[i][j] == 0) {
matrix[i][0] = matrix[0][j] = 0;
}
}
}
for(int i = 1; i < row; i++) {
for(int j = 1; j < col; j++) {
// 遍历矩阵元素并将每一个该行或该列有 0 的元素置 0
if(matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
// 如果第一行、列有 0 则将第一行、列置 0
if(rowOneHas0) {
for(int i = 0; i < row; i++) {
matrix[i][0] = 0;
}
}
if(colOneHas0) {
for(int i = 0; i < col; i++) {
matrix[0][i] = 0;
}
}
}
};
go
// go
func setZeroes(matrix [][]int) {
if len(matrix) == 0 || len(matrix[0]) == 0 {
return
}
row := len(matrix)
col := len(matrix[0])
// 分别记录第一行和第一列中有没有 0
colOneHas0, rowOneHas0 := false, false
for _, num := range matrix {
if num[0] == 0 {
rowOneHas0 = true
break
}
}
for _, num := range matrix[0] {
if num == 0 {
colOneHas0 = true
break
}
}
// 扫描每一个矩阵元素并标记在第一行和第一列
for i := 1; i < row; i++ {
for j := 1; j < col; j++ {
if matrix[i][j] == 0 {
matrix[i][0] = 0
matrix[0][j] = 0
}
}
}
for i := 1; i < row; i++ {
for j := 1; j < col; j++ {
// 遍历矩阵元素并将每一个该行或该列有 0 的元素置 0
if matrix[i][0] == 0 || matrix[0][j] == 0 {
matrix[i][j] = 0
}
}
}
// 如果第一行、列有 0 则将第一行、列置 0
if rowOneHas0 {
for i := 0; i < row; i++ {
matrix[i][0] = 0;
}
}
if colOneHas0 {
for i := 0; i < col; i++ {
matrix[0][i] = 0;
}
}
}