力扣Hot100矩阵问题详解(Python版)

一、73. 矩阵置零

  • 思路:
    遍历全部元素,遇到为0的行、列就保存行号,列好(这里要使用字典,为了去重)
  • 代码:
  • class Solution:
        def setZeroes(self, matrix: List[List[int]]) -> None:
            """
            Do not return anything, modify matrix in-place instead.
            """
            row_set = set()
            col_set = set()
            
            # 标记所有需要置零的行和列
            for i in range(len(matrix)):
                for j in range(len(matrix[0])):
                    if matrix[i][j] == 0:
                        row_set.add(i)
                        col_set.add(j)
                        
            # 将标记的行和列置零
            for row in row_set:
                for j in range(len(matrix[0])):
                    matrix[row][j] = 0
                    
            for col in col_set:
                for i in range(len(matrix)):
                    matrix[i][col] = 0
    

    二、54. 螺旋矩阵

  • 思路:
    螺旋矩阵相关的题目建议都这样做,定义好l, r, t, b;while循环遍历整个矩阵,每次遍历一行或者一列,就缩小边界;判断边界是否违反常识,违反就跳出循环。
  • 代码:
  • class Solution:
        def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
            if not matrix: return []
            l, r, t, b, res = 0, len(matrix[0]) - 1, 0, len(matrix) - 1, []
            while True:
                for i in range(l, r + 1): res.append(matrix[t][i]) # left to right
                t += 1
                if t > b: break
                for i in range(t, b + 1): res.append(matrix[i][r]) # top to bottom
                r -= 1
                if l > r: break
                for i in range(r, l - 1, -1): res.append(matrix[b][i]) # right to left
                b -= 1
                if t > b: break
                for i in range(b, t - 1, -1): res.append(matrix[i][l]) # bottom to top
                l += 1
                if l > r: break
            return res
    

    三、48. 旋转图像

  • 思路:
    先将上下三角两两交换,再行交换
  • 代码:
  • # 思路:先进行对角线交换,在每一行交换就完成转换90度
    class Solution:
        def rotate(self, matrix: List[List[int]]) -> None:
            n = len(matrix)
            for j in range(n):
                for i in range(j):
                    matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
                    
            for i in range(n):
                matrix[i].reverse()
                
    #       也可以写为
    #		for i in range(n):
    #			matrix[i] = matrix[i][::-1]
    

    四、240. 搜索二维矩阵 II

  • 思路1:
    站在矩阵的右上角来说,当前元素是当前行最大,当前列的最小值。判断右上角元素和target的关系,从而简化剩余矩阵
  • 代码:
  • class Solution:
        def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
            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                   # 1.找到 target
                if matrix[i][j] < target:
                    i += 1  # 这一行剩余元素全部小于 target,排除
                else:
                    j -= 1  # 这一列剩余元素全部大于 target,排除
            return False
    

    作者:Y1nhl

    物联沃分享整理
    物联沃-IOTWORD物联网 » 力扣Hot100矩阵问题详解(Python版)

    发表回复