LeetCode 0048
48. Rotate Image
- Nhãn: Mảng, Toán học, Ma trận
- Độ khó: Trung bình
Tóm tắt đề bài
Mô tả: Cho một ma trận hai chiều kích thước (đại diện cho hình ảnh) .
Yêu cầu: Xoay ma trận hai chiều theo chiều kim đồng hồ 90°.
Giải thích:
- Không được sử dụng không gian mảng phụ.
- .
- .
- .
Ví dụ:
- Ví dụ 1:
Đầu vào: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Đầu ra: [[7,4,1],[8,5,2],[9,6,3]]
- Ví dụ 2:
Đầu vào: matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
Đầu ra: [[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
Ý tưởng giải quyết
Ý tưởng 1: Xoay trực tiếp
Nếu sử dụng không gian mảng phụ, chỉ cần đặt các phần tử tương ứng vào vị trí tương ứng. Nếu không sử dụng không gian mảng phụ, ta cần quan sát điểm ban đầu và điểm cuối cùng của mỗi vị trí trên ma trận.
Với phần tử thứ của hàng thứ trong ma trận, sau khi xoay, nó sẽ xuất hiện ở vị trí thứ của cột thứ . Tức là .
Phần tử tại vị trí sau khi xoay sẽ di chuyển đến vị trí thứ .
Phần tử tại vị trí sau khi xoay sẽ di chuyển đến vị trí thứ .
Phần tử tại vị trí sau khi xoay sẽ di chuyển đến vị trí ban đầu .
Điều này tạo thành một vòng lặp, ta chỉ cần sử dụng một biến tạm thời để hoán đổi từng phần tử trong vòng lặp. Trong Python, ta có thể sử dụng cú pháp để hoán đổi trực tiếp.
Ý tưởng 1: Code
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
n = len(matrix)
for i in range(n // 2):
for j in range((n + 1) // 2):
matrix[i][j], matrix[n - j - 1][i], matrix[n - i - 1][n - j - 1], matrix[j][n - i - 1] = matrix[n - j - 1][i], matrix[n - i - 1][n - j - 1], matrix[j][n - i - 1], matrix[i][j]
Ý tưởng 1: Độ phức tạp
- Độ phức tạp thời gian: .
- Độ phức tạp không gian: .
Ý tưởng 2: Lật ngang và lật chéo chính
Qua quan sát, ta có thể thấy: ma trận gốc có thể được biến đổi thành ma trận sau một lần "lật ngang" + "lật chéo chính".
Ý tưởng 2: Code
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
n = len(matrix)
for i in range(n // 2):
for j in range(n):
matrix[i][j], matrix[n - i - 1][j] = matrix[n - i - 1][j], matrix[i][j]
for i in range(n):
for j in range(i):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
Ý tưởng 2: Độ phức tạp
- Độ phức tạp thời gian: .
- Độ phức tạp không gian: .