LeetCode 73. 矩陣置零 python

 給定一個m×n的矩陣,如果一個元素爲0,則將其所在行和列的所有的元素都設爲0,請使用原地算法。

示例 1:

輸入: 
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
輸出: 
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]

示例 2:

輸入: 
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
輸出: 
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]

進階:

  • 一個直接的解決方案是使用  O(mn) 的額外空間,但這並不是一個好的解決方案。
  • 一個簡單的改進方案是使用 O(m + n) 的額外空間,但這仍然不是最好的解決方案。
  • 你能想出一個常數空間的解決方案嗎?

解題:這個題的要求是使用原地算法,即不使用額外的空間。

1.考慮利用原矩陣的首行首列存儲0元素所在的行和列的位置。即,如果(i,j)位置的元素爲0,那麼第i行和第j列都要置0,因此映射到首行首列的位置爲(0,j),(i,0)。

2.同時也要考慮到首行和首列是否存在0的情況,如果存在,經過1的操作,該0可能被覆蓋.。

3.設置兩個flag,判斷首行和首列本身是否存在0元素。如果存在設置爲True,然後決定首行和首列是否置零。(這一點要最先處理)

def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        # 設置兩個Flag,判斷首行首列是否存在0元素
        row,col=False,False
        for i in range(len(matrix)):
            if matrix[i][0]==0:
                row=True
        for j in range(len(matrix[0])):
            if matrix[0][j]==0:
                col=True
        # 將0元素映射到首行首列
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                if matrix[i][j]==0:
                    matrix[i][0]=0
                    matrix[0][j]=0
        # 根據首行首列的0將除了首行首列外的對應行列的元素置零
        for i in range(1,len(matrix)):
            if matrix[i][0]==0:
                for j in range(len(matrix[0])):
                    matrix[i][j]=0
        for j in range(1,len(matrix[0])):
            if matrix[0][j]==0:
                for i in range(len(matrix)):
                    matrix[i][j]=0
        # 根據Flag判斷是否將首行首列置零
        if col:
            for j in range(len(matrix[0])):
                matrix[0][j]=0
        if row:
            for i in range(len(matrix)):
                matrix[i][0]=0
        print(matrix)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章