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


    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))
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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]))
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    linux下sed用法
    C# Winform 系统方案目录的管理开发
    SPI接口协议的学习3
    持续集成部署-k8s-服务发现-Service:Service、Endpoint、Pod之间的关系与原理
    大型网站如何选择比较好的云主机服务商?
    【源码+课程】Java精选课程_Java基础课程_名师讲解,从入门到精通,只需这一套课程_Java300集_附Java最全学习路线图和就业分析_持续更新中
    码住!Elsevier-最全清样/校样(Proof)处理流程
    FPC焊点剥离失效分析
    Linux Hadoop平台伪分布式安装(Hive on Spark)
    python 爬取图片
  • 原文地址:https://blog.csdn.net/weixin_45451320/article/details/126146548