初级算法_数组 --- 旋转图像

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]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_焦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值