时间:2020-6-16
题目地址:https://leetcode-cn.com/problems/rotate-matrix-lcci/
题目难度:Medium
题目描述:
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。
不占用额外内存空间能否做到?
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
思路1:使用额外空间
代码段1:通过
clasclass Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
n = len(matrix)
temp = [[0] * n for _ in range(n)]
for i in range(0,n):
for j in range(0,n):
temp[j][n - i - 1] = matrix[i][j]
print(temp)
matrix[:] = temp
总结:
- 使用额外空间折腾了好久
- 还有利用此公式进行原地旋转的,数学公式不停推导,头炸了,不看了
思路2:python的奇淫技巧 先上下翻转,再zip取转置
代码段2:通过
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
matrix[:] = zip(*matrix[::-1])
总结:
- 内存100%,大家太厉害了吧
思路3:用反转代替旋转,先水平翻转,再对角线【左上-右下】翻转
代码段3:通过
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
n = len(matrix)
# 水平翻转
for i in range(n // 2):
for j in range(n):
temp = matrix[i][j]
matrix[i][j] = matrix[n - i - 1][j]
matrix[n - i - 1][j] = temp
# 对角线翻转
for i in range(n):
for j in range(i):
temp = matrix[i][j]
matrix[i][j] = matrix[j][i]
matrix[j][i] = temp
print(temp)
print(matrix)
总结:
- 内存100%,大家太厉害了吧
- 看下优化的,太爽了吧
- 当然 先对角线,后一行中点也行
- 9:30了,今天方案捋得头疼,又和同事唠了会1h,困的不行了,熬不住了,不看了,溜了溜了
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
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]
print(matrix)