python 五种算法转置后翻转、层次旋转、递归分块、一次性旋转、环状替换 实现旋转图像【力扣题48】

简介: python 五种算法转置后翻转、层次旋转、递归分块、一次性旋转、环状替换 实现旋转图像【力扣题48】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。

会一些的技术:数据分析、算法、SQL、大数据相关、python

欢迎加入社区:码上找工作

作者专栏每日更新:

LeetCode解锁1000题: 打怪升级之旅

python数据分析可视化:企业实战案例

备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

题目描述

给定一个 n × n 的二维矩阵,代表一个图像,你需要将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

输入格式
  • matrix:一个二维整数数组,代表一个图像。
输出格式
  • 不需要返回任何结果,应当在原数组上修改,即原地旋转图像。

示例

示例 1
输入:matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]
输出:[
  [7, 4, 1],
  [8, 5, 2],
  [9, 6, 3]
]

解释:该矩阵顺时针旋转 90 度后,矩阵第一行变为原矩阵的最后一列,第二行变为原矩阵的中间一列,第三行变为原矩阵的第一列,且都是从下到上的顺序。

示例 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]
]

约束条件

  • matrix.length == n
  • matrix[i].length == n
  • 1 <= n <= 20
  • -1000 <= matrix[i][j] <= 1000

这个问题要求旋转矩阵而不使用额外的空间,即原地修改,这意味着算法需要特别注意操作的顺序和方式,以确保数据不会被错误覆盖。

方法一:转置后翻转

解题步骤
  1. 转置矩阵:将矩阵的行转换为列,即 matrix[i][j]matrix[j][i] 交换。
  2. 翻转每行:将每行的元素翻转,即首尾元素交换,实现顺时针旋转的效果。
完整的规范代码
def rotate(matrix):
    """
    通过转置矩阵后翻转每行来顺时针旋转图像
    :param matrix: List[List[int]], n x n 的二维矩阵
    :return: None
    """
    n = len(matrix)
    # 转置矩阵
    for i in range(n):
        for j in range(i + 1, n):
            matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
    
    # 翻转每行
    for i in range(n):
        matrix[i].reverse()
# 示例调用
matrix_example = [[1,2,3],[4,5,6],[7,8,9]]
rotate(matrix_example)
print(matrix_example)  # 输出: [[7,4,1],[8,5,2],[9,6,3]]
算法分析
  • 时间复杂度:(O(n^2)),需要遍历矩阵两次。
  • 空间复杂度:(O(1)),原地修改矩阵,不需要额外空间。

方法二:层次旋转法

解题步骤
  1. 外层到内层:分层处理矩阵,从外层到内层逐层旋转。
  2. 四角替换:对于每一层,将四个角的元素依次旋转。
完整的规范代码
def rotate(matrix):
    """
    使用层次旋转法顺时针旋转图像
    :param matrix: List[List[int]], n x n 的二维矩阵
    :return: None
    """
    n = len(matrix)
    for i in range(n // 2):
        for j in range(i, n - i - 1):
            temp = matrix[i][j]
            matrix[i][j] = matrix[n-j-1][i]
            matrix[n-j-1][i] = matrix[n-i-1][n-j-1]
            matrix[n-i-1][n-j-1] = matrix[j][n-i-1]
            matrix[j][n-i-1] = temp
# 示例调用
matrix_example = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
rotate(matrix_example)
print(matrix_example)  # 输出: [[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
算法分析
  • 时间复杂度:(O(n^2)),虽然只遍历半个矩阵,但仍然是平方级别。
  • 空间复杂度:(O(1)),原地修改,无需额外空间。

方法三:递归分块法

解题步骤
  1. 递归分块:将矩阵视为四块小矩阵,递归地进行旋转。
  2. 递归基:当矩阵缩小到1x1或2x2时,直接进行手动旋转。
完整的规范代码
def rotate(matrix):
    """
    使用递归分块法顺时针旋转图像
    :param matrix: List[List[int]], n x n 的二维矩阵
    :return: None
    """
    def rotate_submatrix(matrix, row, col, size):
        if size <= 1:
            return
        for i in range(size - 1):
            tmp = matrix[row][col + i]
            matrix[row][col + i] = matrix[row + size - 1 - i][col]
            matrix[row + size - 1 - i][col] = matrix[row + size - 1][col + size - 1 - i]
            matrix[row + size - 1][col + size - 1 - i] = matrix[row + i][col + size - 1]
            matrix[row + i][col + size - 1] = tmp
        rotate_submatrix(matrix, row + 1, col + 1, size - 2)
    rotate_submatrix(matrix, 0, 0, len(matrix))
# 示例调用
matrix_example = [[1,2,3],[4,5,6],[7,8,9]]
rotate(matrix_example)
print(matrix_example)  # 输出: [[7,4,1],[8,5,2],[9,6,3]]
算法分析
  • 时间复杂度:(O(n^2)),每个元素基本上都被处理一次,尽管是通过递归进行的。
  • 空间复杂度:(O(n)),递归深度最大可能为 (n/2),主要取决于矩阵的大小。

方法四:一次性旋转法

解题步骤
  1. 单次操作:直接计算每个元素旋转后的位置,将所有元素一次性放到正确位置上。
  2. 额外空间:使用额外的同样大小的矩阵来进行位置计算和值存储。
完整的规范代码
def rotate(matrix):
    """
    使用一次性旋转法顺时针旋转图像,需要额外空间
    :param matrix: List[List[int]], n x n 的二维矩阵
    :return: None
    """
    n = len(matrix)
    new_matrix = [[0] * n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            new_matrix[j][n-i-1] = matrix[i][j]
    for i in range(n):
        for j in range(n):
            matrix[i][j] = new_matrix[i][j]
# 示例调用
matrix_example = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
rotate(matrix_example)
print(matrix_example)  # 输出: [[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
算法分析
  • 时间复杂度:(O(n^2)),遍历一次所有元素。
  • 空间复杂度:(O(n^2)),使用了额外的矩阵来存储旋转结果。

方法五:环状替换

解题步骤
  1. 外圈到内圈:分层处理矩阵,从外层到内层逐层旋转,每一层视为一个环。
  2. 环内旋转:每个元素按环进行替换,每四个元素为一组进行位置交换。
完整的规范代码
def rotate(matrix):
    """
    使用环状替换顺时针旋转图像
    :param matrix: List[List[int]], n x n 的二维矩阵
    :return: None
    """
    n = len(matrix)
    layers = n // 2
    for layer in range(layers):
        first, last = layer, n - layer - 1
        for i in range(first, last):
            offset = i - first
            top = matrix[first][i]
            matrix[first][i] = matrix[last-offset][first]
            matrix[last-offset][first] = matrix[last][last-offset]
            matrix[last][last-offset] = matrix[i][last]
            matrix[i][last] = top
# 示例调用
matrix_example = [[1,2,3],[4,5,6],[7,8,9]]
rotate(matrix_example)
print(matrix_example)  # 输出: [[7,4,1],[8,5,2],[9,6,3]]
算法分析
  • 时间复杂度:(O(n^2)),每个元素基本上都被处理一次。
  • 空间复杂度:(O(1)),原地修改矩阵,不使用额外空间。

不同算法的优劣势对比

特征 方法一:转置后翻转 方法二:层次旋转法 方法三:递归分块法 方法四:一次性旋转法 方法五:环状替换
时间复杂度 (O(n^2)) (O(n^2)) (O(n^2)) (O(n^2)) (O(n^2))
空间复杂度 (O(1)) (O(1)) (O(n)) (O(n^2)) (O(1))
优势 - 简单实用
- 快速有效
- 直观操作
- 无需额外空间
- 递归清晰
- 易于理解
- 计算直接
- 易于实现
- 高效
- 不需要额外空间
劣势 - 需要两步处理 - 需要精确控制边界 - 需要额外空间
- 递归复杂
- 空间成本高 - 需要精确控制层和边界

在选择合适的方法时,应考虑实际的需求和问题规模。例如,对于需要在有限空间内操作的场景,环状替换和层次旋转法是最优的选择;而对于能够接受一定空间换时间的场景,则可以考虑一次性旋转法或递归分块法,这些方法提供了不同的视角和实现方式,适合不同的应用环境和性能要求。


欢迎关注微信公众号 数据分析螺丝钉

相关文章
|
2月前
|
存储 监控 算法
企业数据泄露风险防控视域下 Python 布隆过滤器算法的应用研究 —— 怎样防止员工私下接单,监控为例
本文探讨了布隆过滤器在企业员工行为监控中的应用。布隆过滤器是一种高效概率数据结构,具有空间复杂度低、查询速度快的特点,适用于大规模数据过滤场景。文章分析了其在网络访问监控和通讯内容筛查中的实践价值,并通过Python实现示例展示其技术优势。同时,文中指出布隆过滤器存在误判风险,需在准确性和资源消耗间权衡。最后强调构建多维度监控体系的重要性,结合技术与管理手段保障企业运营安全。
63 10
|
2月前
|
算法 Python
Apriori算法的Python实例演示
经过运行,你会看到一些集合出现,每个集合的支持度也会给出。这些集合就是你想要的,经常一起被购买的商品组合。不要忘记,`min_support`参数将决定频繁项集的数量和大小,你可以根据自己的需要进行更改。
114 18
|
3月前
|
算法 安全 数据安全/隐私保护
基于AES的遥感图像加密算法matlab仿真
本程序基于MATLAB 2022a实现,采用AES算法对遥感图像进行加密与解密。主要步骤包括:将彩色图像灰度化并重置大小为256×256像素,通过AES的字节替换、行移位、列混合及轮密钥加等操作完成加密,随后进行解密并验证图像质量(如PSNR值)。实验结果展示了原图、加密图和解密图,分析了图像直方图、相关性及熵的变化,确保加密安全性与解密后图像质量。该方法适用于保护遥感图像中的敏感信息,在军事、环境监测等领域具有重要应用价值。
139 35
|
1月前
|
算法 安全 数据安全/隐私保护
基于AES的图像加解密算法matlab仿真,带GUI界面
本程序基于AES算法实现图像的加解密功能,并提供MATLAB GUI界面操作,支持加密与解密。运行环境为MATLAB 2022A,测试结果无水印。核心代码通过按钮回调函数完成AES加密与解密流程,包括字节替换、行移位、列混淆及密钥加等步骤。解密过程为加密逆向操作,确保数据安全性与完整性。完整程序结合128位块加密与可选密钥长度,适用于图像信息安全场景。
|
2月前
|
存储 机器学习/深度学习 算法
论上网限制软件中 Python 动态衰减权重算法于行为管控领域的创新性应用
在网络安全与行为管理的学术语境中,上网限制软件面临着精准识别并管控用户不合规网络请求的复杂任务。传统的基于静态规则库或固定阈值的策略,在实践中暴露出较高的误判率与较差的动态适应性。本研究引入一种基于 “动态衰减权重算法” 的优化策略,融合时间序列分析与权重衰减机制,旨在显著提升上网限制软件的实时决策效能。
70 2
|
3月前
|
存储 监控 算法
员工电脑监控场景下 Python 红黑树算法的深度解析
在当代企业管理范式中,员工电脑监控业已成为一种广泛采用的策略性手段,其核心目标在于维护企业信息安全、提升工作效能并确保合规性。借助对员工电脑操作的实时监测机制,企业能够敏锐洞察潜在风险,诸如数据泄露、恶意软件侵袭等威胁。而员工电脑监控系统的高效运作,高度依赖于底层的数据结构与算法架构。本文旨在深入探究红黑树(Red - Black Tree)这一数据结构在员工电脑监控领域的应用,并通过 Python 代码实例详尽阐释其实现机制。
80 7
|
4月前
|
人工智能 编解码 算法
如何在Python下实现摄像头|屏幕|AI视觉算法数据的RTMP直播推送
本文详细讲解了在Python环境下使用大牛直播SDK实现RTMP推流的过程。从技术背景到代码实现,涵盖Python生态优势、AI视觉算法应用、RTMP稳定性及跨平台支持等内容。通过丰富功能如音频编码、视频编码、实时预览等,结合实际代码示例,为开发者提供完整指南。同时探讨C接口转换Python时的注意事项,包括数据类型映射、内存管理、回调函数等关键点。最终总结Python在RTMP推流与AI视觉算法结合中的重要性与前景,为行业应用带来便利与革新。
192 5
|
5月前
|
存储 算法 Java
算法系列之递归反转单链表
递归反转链表的基本思路是将当前节点的next指针指向前一个节点,然后递归地对下一个节点进行同样的操作。递归的核心思想是将问题分解为更小的子问题,直到达到基本情况(通常是链表末尾)。
92 5
算法系列之递归反转单链表
|
5月前
|
人工智能 编解码 算法
使用 PAI-DSW x Free Prompt Editing图像编辑算法,开发个人AIGC绘图小助理
使用 PAI-DSW x Free Prompt Editing图像编辑算法,开发个人AIGC绘图小助理
|
16天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB2022a/2024b开发,结合粒子群优化(PSO)算法与双向长短期记忆网络(BiLSTM),用于优化序列预测任务中的模型参数。核心代码包含详细中文注释及操作视频,涵盖遗传算法优化过程、BiLSTM网络构建、训练及预测分析。通过PSO优化BiLSTM的超参数(如学习率、隐藏层神经元数等),显著提升模型捕捉长期依赖关系和上下文信息的能力,适用于气象、交通流量等场景。附有运行效果图预览,展示适应度值、RMSE变化及预测结果对比,验证方法有效性。

热门文章

最新文章

推荐镜像

更多