优秀的编程知识分享平台

网站首页 > 技术文章 正文

矩阵:用golang实现矩阵归0的算法

nanyue 2025-01-18 22:56:47 技术文章 2 ℃

题目介绍:给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

解题思想: 利用矩阵的第一行和第一列作为标记位,来记录哪些行和列需要被置为0,从而避免使用额外的空间

完整代码如下:

package main

import (
    "fmt"
    "testing"
)

func jzZero(matrix [][]int) [][]int {
    // 初始化行数和列数
    rows, cols := len(matrix), len(matrix[0])
    // 是否第一行中有0 标识,后面根据这个来判定是否需要特殊处理第一行
    zeroRow := 1
    // 遍历二位数组,
    // 当其中一个格子数据为0时,将对应的第一行相同列的数组改成0
    // 如果不是第一行,则将该格子对应的行第一个列改成0
    // 并判断为0的格子是否是第一行
    for row := 0; row < rows; row++ {
       for col := 0; col < cols; col++ {
          if matrix[row][col] == 0 {
             matrix[0][col] = 0
             if row > 0 {
                matrix[row][0] = 0
             } else {
                zeroRow = 0
             }
          }
       }
    }
    // 根据上面设置的第一行,和第一列中为0的值,将非第一行和第一列纵横对应的行和列格子都设置0
    // 这里行和列的起始坐标都不能是0,要不然就会破坏参照数据,最终整个格子都变成0
    for row := 1; row < rows; row++ {
       for col := 1; col < cols; col++ {
          if matrix[0][col] == 0 || matrix[row][0] == 0 {
             matrix[row][col] = 0
          }
       }
    }
    // 单独处理第一列
    if matrix[0][0] == 0 {
       for row := 0; row < rows; row++ {
          matrix[row][0] = 0
       }
    }

    // 当第一行中有0时,则整行都为0
    if zeroRow == 0 {
       for col := 0; col < cols; col++ {
          matrix[0][col] = 0
       }
    }

    return matrix
}

func TestJZero(t *testing.T) {
    matrix := [][]int{
       {0, 1, 2, 0},
       {3, 4, 5, 2},
       {1, 3, 1, 5},
    }
    matrix = jzZero(matrix)
    for val := range matrix {
       fmt.Println(matrix[val])
    }
}

Tags:

最近发表
标签列表