LeetCode 0073
About 2 min
73. Set Matrix Zeroes
- Tags: Mảng, Bảng băm, Ma trận
- Độ khó: Trung bình
Tóm tắt đề bài
Mô tả: Cho một ma trận kích thước .
Yêu cầu: Nếu một phần tử là , hãy đặt tất cả các phần tử trong hàng và cột của nó thành .
Giải thích:
- Vui lòng sử dụng giải thuật "tại chỗ".
- .
- .
- .
- .
- Nâng cao:
- Một giải pháp trực quan là sử dụng không gian phụ , nhưng đây không phải là một giải pháp tốt.
- Một giải pháp cải tiến đơn giản là sử dụng không gian phụ , nhưng đây vẫn không phải là giải pháp tốt nhất.
- Bạn có thể tìm ra một giải pháp chỉ sử dụng không gian hằng số không?
Ví dụ:
- Ví dụ 1:
Đầu vào: matrix = [[1,1,1],[1,0,1],[1,1,1]]
Đầu ra: [[1,0,1],[0,0,0],[1,0,1]]
- Ví dụ 2:
Đầu vào: matrix = [[1,1,1],[1,0,1],[1,1,1]]
Đầu ra: [[1,0,1],[0,0,0],[1,0,1]]
Ý tưởng giải quyết
Ý tưởng 1: Sử dụng biến đánh dấu
Một cách trực quan là sử dụng hai mảng để đánh dấu hàng và cột xuất hiện , nhưng điều này sẽ tốn không gian , không đáp ứng yêu cầu.
Xem xét việc sử dụng các phần tử của mảng để ghi lại trạng thái xuất hiện .
- Đặt hai biến và để đánh dấu xem hàng đầu tiên và cột đầu tiên có xuất hiện hay không.
- Tiếp theo, chúng ta sử dụng hàng đầu tiên và cột đầu tiên của mảng để đánh dấu trạng thái .
- Duyệt qua từng phần tử của mảng, nếu một phần tử nào đó xuất hiện , chúng ta sử dụng các vị trí tương ứng của hàng đầu tiên và cột đầu tiên của mảng để lưu trữ đánh dấu .
- Tiếp theo, duyệt qua từng phần tử của mảng, dựa vào đánh dấu của hàng đầu tiên và cột đầu tiên để đặt các phần tử tương ứng thành .
- Cuối cùng, dựa vào đánh dấu của hàng đầu tiên và cột đầu tiên để đặt hàng đầu tiên và cột đầu tiên thành .
Ý tưởng 1: Code
class Solution:
def setZeroes(self, matrix: List[List[int]]) -> None:
m = len(matrix)
n = len(matrix[0])
flag_col0 = False
flag_row0 = False
for i in range(m):
if matrix[i][0] == 0:
flag_col0 = True
break
for j in range(n):
if matrix[0][j] == 0:
flag_row0 = True
break
for i in range(1, m):
for j in range(1, n):
if matrix[i][j] == 0:
matrix[i][0] = matrix[0][j] = 0
for i in range(1, m):
for j in range(1, n):
if matrix[i][0] == 0 or matrix[0][j] == 0:
matrix[i][j] = 0
if flag_col0:
for i in range(m):
matrix[i][0] = 0
if flag_row0:
for j in range(n):
matrix[0][j] = 0
Ý tưởng 1: Độ phức tạp
- Độ phức tạp thời gian: .
- Độ phức tạp không gian: .