转置矩阵

标签: 数组 矩阵 模拟

难度: Easy

给你一个二维整数数组 matrix, 返回 matrix转置矩阵

矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。

 

示例 1:

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

示例 2:

输入:matrix = [[1,2,3],[4,5,6]]
输出:[[1,4],[2,5],[3,6]]

 

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 1000
  • 1 <= m * n <= 105
  • -109 <= matrix[i][j] <= 109

Submission

运行时间: 21 ms

内存: 16.6 MB

class Solution:
    def transpose(self, matrix: List[List[int]]) -> List[List[int]]:
        m, n = len(matrix), len(matrix[0])
        ans = [[0] * m for _ in range(n)]
        for i, row in enumerate(matrix):
            for j, num in enumerate(row):
                ans[j][i] = num
        return ans

Explain

题解的核心思路是创建一个新的二维数组,其维度为原数组的转置,即原数组的行变成列,列变成行。通过两层循环,第一层遍历原矩阵的每一行,第二层循环遍历行中的每一个元素,并将元素放置到新矩阵的对应位置。这样就可以实现矩阵的转置操作。

时间复杂度: O(m * n)

空间复杂度: O(n * m)

class Solution:
    def transpose(self, matrix: List[List[int]]) -> List[List[int]]:
        m, n = len(matrix), len(matrix[0])  # 获取矩阵的行数和列数
        ans = [[0] * m for _ in range(n)]  # 创建一个 n x m 的新矩阵,初始值为 0
        for i, row in enumerate(matrix):  # 遍历原矩阵的每一行
            for j, num in enumerate(row):  # 遍历行中的每一个元素
                ans[j][i] = num  # 将元素放置在新矩阵的对应位置
        return ans  # 返回转置后的矩阵

Explore

在处理大型矩阵如1000x1000时,这种双层循环的转置方法会涉及大约1,000,000次操作,这在现代计算机上通常是可处理的。但是,依然可能面临性能瓶颈,特别是在内存使用和缓存效率方面。大型矩阵的转置可能导致大量的缓存未命中和内存页面调度,影响总体性能。为了优化,可以考虑使用更高效的内存访问模式或并行处理技术。

在矩阵的转置过程中,负数或极大极小值并不需要特别处理,因为转置操作仅涉及元素位置的变换,而不改变元素值本身。不论是负数、极大值还是极小值,只要它们在数据类型允许的范围内,就可以被正常处理。重要的是确保使用的数据类型能够容纳这些极端值以避免数据溢出或精度问题。

在矩阵转置的过程中,整型溢出通常不会发生,因为转置操作不涉及数值的加法、乘法或其他可能导致溢出的运算。每个元素只是简单地从一个位置移动到另一个位置。只要原始矩阵中的数据没有超出其数据类型的范围,就不会在转置过程中发生溢出。确保数据在合理的范围内是预防溢出的关键。

转置后的矩阵在逻辑上等价于原矩阵的镜像,但在物理内存中的表示可能不同,这取决于编程语言和系统的内存管理方式。例如,在一些语言中,数组是行优先存储的,而在其他语言中可能是列优先。这种存储方式的差异可能导致转置后的矩阵的内存布局与原矩阵不完全相同。因此,虽然逻辑结构相同,物理结构可能因平台而异。