leetcode 867. Transpose Matrix(转置矩阵)

本文介绍了如何使用Java编程语言实现矩阵的转置操作。通过将矩阵的行变为列,列变为行,代码实现了对二维整数矩阵的转置。核心算法是遍历原矩阵的每个元素,并将其按转置后的位置存入新矩阵。

在这里插入图片描述

把矩阵转置。

思路:
列变行,行变列。

public int[][] transpose(int[][] matrix) {
    int rows = matrix.length;
    int cols = matrix[0].length;

    int[][] res = new int[cols][rows];
    
    for(int r = 0; r < rows; r ++) {
        for(int c = 0; c < cols; c++) {
            res[c][r] = matrix[r][c];
        }
    }
    return res;
}
### 问题描述 LeetCode867题的题目是“转置矩阵”(Transpose Matrix),任务是将一个 $ m \times n $ 的矩阵转置为 $ n \times m $ 的矩阵转置操作即将原矩阵的行和列互换,例如原矩阵中位于第 $ i $ 行第 $ j $ 列的元素,在转置后的矩阵中变为第 $ j $ 行第 $ i $ 列的元素。 例如,输入矩阵: ``` [[1,2,3], [4,5,6]] ``` 输出应为: ``` [[1,4], [2,5], [3,6]] ``` ### 解法分析与实现 #### 方法一:双循环构造新矩阵 该方法通过两次遍历原矩阵的行列索引,直接构造转置矩阵。时间复杂度为 $ O(m \cdot n) $,空间复杂度也为 $ O(m \cdot n) $,适用于大多数情况。 ```cpp class Solution { public: vector<vector<int>> transpose(vector<vector<int>>& matrix) { int m = matrix.size(); int n = matrix[0].size(); vector<vector<int>> result(n, vector<int>(m)); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { result[j][i] = matrix[i][j]; } } return result; } }; ``` 此解法直观且易于理解,适合处理任意大小的矩阵[^1]。 #### 方法二:原地修改(仅适用于方阵) 当输入矩阵是一个方阵(即 $ m = n $)时,可以使用原地修改的方法减少额外空间的使用。通过交换对角线上的元素即可完成转置操作。 ```cpp class Solution { public: vector<vector<int>> transpose(vector<vector<int>>& matrix) { int n = matrix.size(); for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { swap(matrix[i][j], matrix[j][i]); } } return matrix; } }; ``` 此方法的空间复杂度为 $ O(1) $,但仅适用于行数等于列数的情况[^1]。 ### 时间复杂度与适用场景 - **双循环构造新矩阵**:适用于所有 $ m \times n $ 矩阵,时间复杂度为 $ O(m \cdot n) $,空间复杂度为 $ O(n \cdot m) $。 - **原地修改**:仅适用于方阵,时间复杂度为 $ O(n^2) $,空间复杂度为 $ O(1) $。 ### 相关问题 1. 如何判断一个矩阵是否为方阵? 2. 转置矩阵在图像处理或线性代数中的实际应用有哪些? 3. 原地修改算法在哪些场景下更具优势? 4. 如何高效处理稀疏矩阵转置问题?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝羽飞鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值