1、题目
给定一个 n×n 的二维矩阵matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
2、解法
from typing import List
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
# map\zip函数解决,这里的matrix[:]应该可以接收一个迭代器所以去掉list也是可以的
matrix[:]=map(list,zip(*matrix[::-1]))
matrix[:]=list(map(list,zip(*matrix[::-1])))
# 给原列表添加指定规则的值,最后删除列表每个元素的前n个元素
n = len(matrix)
# 从后开始遍历
for j in range(n-1,-1,-1):
# 继续从后开始遍历
for i in range(n-1,-1,-1):
# 给列表索引为2的元素添加元素,元素为[i][2],i = 2,1,0,也就是列表中每个元素的最后一个值,比如963 852 741
matrix[j].append(matrix[i][j])
# 删掉列表中每个元素的前n个元素
for i in range(n):
del matrix[i][:n]
# # 不用原地处理
a = []
for i in zip(*matrix):
print(i)
a.append([i[x] for x in reversed(range(len(i)))])
print(a)
# 优化下代码
return [[i[x] for x in reversed(range(len(i)))] for i in zip(*matrix)]
if __name__ == '__main__':
matrix = [[1,2,3],[4,5,6],[7,8,9]]
a = Solution()
print(a.rotate(matrix))
3、思路
旋转90度,将列横着放,python内置函数中,跟二维数组有关系的,自然是zip,zip可以将行、列华为元组
(1)第一步,通过zip遍历出每列的值
(2)第二步,将每列的值在原地反转:[i[x] for x in reversed(range(len(i)))]
再次整理下,
数组正向查询:for i in range(x),
数组反向查询:for i in reversed(range(x))
数组反向查询: for i in range(x-1,-1,-1)
a = (0, 3, 6)
for i in range(4-1, -1, -1):
print(i)
for i in range(4):
print(i)
map、zip求解思路:
# zip(*matrix[::-1] 反转数组,并解包返回迭代器
b = [i for i in zip(*matrix[::-1])]
print(b)
# map(list, zip(*matrix[::-1])) 将zip返回的元组用list函数处理,并重写数组matrix
matrix[:]=map(list,zip(*matrix[::-1]))