Skip to content

05-矩阵

📅 发表于 2026/04/02
🔄 更新于 2026/04/02
👁️ -- 次访问
📝 0 字
0 分钟

总结

题目总结

1-073-矩阵置零

题目

  • 输入m*n矩阵,如果某元素为0,把其所在行和列都置为0,使用原地算法

首行首列记录法

  • 使用第1行n列,来记录各列置为0的情况。
  • 使用第1列n行,来记录各行置为0的情况。
  • 00位置缺一个:需要单独记录首行和首列是否置为0
2-054-螺旋矩阵

题目

  • 给定矩阵,顺时针螺旋输出矩阵元素

右下左上四点圈层遍历法

  • 设置左右上下边界,沿边界遍历:从左->右上->下右->左下->上
  • 注意 右->左 需保证up!=down 不在同一行
  • 注意 下->上 需保证left!=right 不在同一列
3-048-旋转图像

题目

  • 给定n*n矩阵,沿顺时针旋转90度

复制赋值法

  • 复制原始矩阵(额外空间开销),利用位置映射直接赋值

    (i,j)(ni1,j)

转置翻转法

  • 对矩阵做转置,再对每一行 沿着竖中直线做翻转[123456789][147258369][741852963]
4-240-搜索二维矩阵2

题目

  • 给定m*n矩阵,矩阵每行从左到右升序每列从上到下升序。判断target是否存在矩阵中。

右上角查找法

  • 从右上角出发(0,n-1),进行查找
    • 当前值 > target往下移动一行,继续查找
    • 当前值 < target往左移动一列,继续查找
    • 当前值 == target:找到。

题目

1-073-矩阵置零

小心

leetcode-073

  • 输入:m*n的矩阵。如果一个元素为0,则把其所在行和列都置为0,使用原地算法
  • 输出:行列置为0后的原矩阵

首行首列记录法

笔记
  • 使用第1行n列,来记录各列置为0的情况。
  • 使用第1列m行,来记录各行置为0的情况。
  • 00位置缺一个:需要单独记录首行和首列是否置为0
python
def setZeroes(self, matrix: List[List[int]]) -> None:
    """
    使用第1行:n列,记录各列置为0的情况。
    使用第1列:n行,记录各行置为0的情况。
    00位置缺一个:单独记录第1行第1列置为0的情况
    """
    if not matrix or not matrix[0]:
        return

    # m*n 的矩阵, m行,n列
    m = len(matrix)
    n = len(matrix[0])

    # 第1行、第1列是否含0
    row0_has0 = any(matrix[0][j] == 0 for j in range(n))
    col0_has0 = any(matrix[i][0] == 0 for i in range(m))

    # 使用第1行记录各列是否含0情况
    for i in range(1, m):
        for j in range(1, n):
            if matrix[i][j] == 0: 
                # 第i行、第j列均设置为0
                matrix[0][j] = 0
                matrix[i][0] = 0

    # 更新值
    for i in range(1, m):
        for j in range(1, n):
            # 第i行或第j列为0,则ij位置为0
            if matrix[0][j] == 0 or matrix[i][0] == 0:
                matrix[i][j] = 0
    # 首行首列
    if row0_has0:
        for j in range(n):
            matrix[0][j] = 0
    if col0_has0:
        for i in range(m):
            matrix[i][0] = 0
    return

2-054-螺旋矩阵

小心

leetcode-054

  • 输入:矩阵,沿着顺时针 螺旋遍历矩阵
  • 输出:矩阵中的所有元素

右下左上四点圈层遍历法

笔记
  • 设置左右上下边界,沿边界遍历:从左->右上->下右->左下->上
  • 注意 右->左 需保证up!=down 不在同一行
  • 注意 下->上 需保证left!=right 不在同一列
python
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
    """设置上下左右边界,左->右,上->下,右->左,下->上
    """
    res = []
    if not matrix or not matrix[0]:
        return res

    m = len(matrix)
    n = len(matrix[0])

    # 定义上下左右边界值
    up, down = 0, m-1
    left, right = 0, n-1

    while True:
        # 从左往右遍历
        for j in range(left, right+1):
            res.append(matrix[up][j])

        # 从上往下遍历
        for i in range(up+1, down+1):
            res.append(matrix[i][right])

        # 从右往左遍历,需保证up和down不在同一行,才需要遍历
        if up != down:  
            for j in range(right-1, left-1, -1):
                res.append(matrix[down][j])

        # 从下往上遍历, 需保证left和down不在同一列,才需要遍历
        if left != right:  
            for i in range(down-1, up, -1):
                res.append(matrix[i][left])

        # 前进
        up += 1
        down -= 1
        left += 1
        right -= 1

        # 终止循环
        if left > right or up > down:  
            break

    return res

3-048-旋转图像

小心

leetcode-048

  • 输入:n*n的矩阵
  • 输出:原地把矩阵旋转90度

复制赋值法

直接复制法

核心思想

  • 行变列,复制原始矩阵。找到ij元素新位置进行赋值即可。
  • 位置映射:(i,j)(ni1,j)
python
def rotate_copy_row(self, matrix: List[List[int]]) -> None:
    """ 旋转矩阵,复制一行,粘贴到列上
    """
    raw_matrix = copy.deepcopy(matrix)
    n = len(matrix)

    for i in range(n):
        # 第i行,# 复制原ij位置的数
        for j in range(n):
            # 新的行列位置
            new_row_idx = j  
            new_col_idx = n - i - 1
            matrix[new_row_idx][new_col_idx] = raw_matrix[i][j]

    return matrix

转置翻转法

转置翻转法

核心思想

  • 对矩阵做转置:行变列。注意转置遍历只需遍历右上三角

  • 对每行沿竖中直线做翻转

    [123456789][147258369][741852963]
python
def rotate_transpose_then_flip(self, matrix: List[List[int]]) -> None:
    """ 先对矩阵做转置,再对每一行沿着中间做翻转
    """
    if not matrix or len(matrix) == 0:
        return matrix

    n = len(matrix)

    # 先对矩阵做转置,记住遍历只需遍历上三角即可
    for i in range(n):
        for j in range(i+1, n):  
            matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

    # 再对每一行,沿着中间做翻转
    for i in range(n):
        matrix[i].reverse()  

    return matrix

4-240-搜索二维矩阵2

4-240-搜索二维矩阵2

leetcode-240

  • 输入:m*n矩阵目标值t。矩阵从左到右升序从上到下升序
  • 输出:目标值t是否存在

右上角查找法

右上角查找法

核心思想

  • 右上角出发(0,n-1),进行查找
    • 当前值 > target往下移动一行,继续查找
    • 当前值 <target往左移动一列,继续查找
    • 当前值 == target:找到。
python
def searchMatrix_rightupcorner(self, matrix: List[List[int]], target: int) -> bool:
    """ 从右上角开始查找。
    """
    if not matrix or len(matrix) == 0:
        return False

    m, n = len(matrix), len(matrix[0])
    # 初始位置,右上角
    i, j = 0, n-1

    while i < m and j >= 0:
        if matrix[i][j] == target:
            # 找到目标
            return True
        elif matrix[i][j] < target:
            # 往下走
            i += 1
        elif matrix[i][j] > target:
            # 往左找
            j -= 1

    return False
总访客数:   ·   总访问量:
PLM's Blog @ 2016 - 2026