news 2026/1/10 17:18:30

算法题 转置矩阵

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法题 转置矩阵

转置矩阵

问题描述

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

转置矩阵是指将原矩阵的行变成列,列变成行后的新矩阵。

  • 如果原矩阵是m x n,那么转置矩阵就是n x m
  • 转置矩阵中位置(i, j)的元素等于原矩阵中位置(j, i)的元素

示例

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

算法思路

直接转置

  1. 创建一个新的结果矩阵,行数为原矩阵的列数,列数为原矩阵的行数
  2. 遍历原矩阵的每个元素
  3. 将原矩阵中位置(i, j)的元素放到结果矩阵的(j, i)位置
  4. 返回转置后的矩阵

核心思想

  • 转置的本质就是行列互换
  • 对于任意矩阵(包括非方阵),都可以进行转置操作
  • 时间复杂度为 O(m × n),空间复杂度为 O(m × n)

代码实现

方法一:创建新矩阵

classSolution{/** * 转置矩阵 - 创建新矩阵 * * @param matrix 输入的二维矩阵,维度为 m x n * @return 转置后的矩阵,维度为 n x m * * 算法思路: * 1. 获取原矩阵的行数 m 和列数 n * 2. 创建结果矩阵 transposed,维度为 n x m * 3. 遍历原矩阵每个位置 (i, j) * 4. 将 matrix[i][j] 赋值给 transposed[j][i] */publicint[][]transpose(int[][]matrix){// 获取原矩阵的行数和列数intm=matrix.length;// 原矩阵行数intn=matrix[0].length;// 原矩阵列数// 创建转置矩阵,行数为原矩阵列数,列数为原矩阵行数int[][]transposed=newint[n][m];// 遍历原矩阵的每个元素for(inti=0;i<m;i++){for(intj=0;j<n;j++){// 将原矩阵 (i, j) 位置的元素放到转置矩阵 (j, i) 位置transposed[j][i]=matrix[i][j];}}returntransposed;}}

方法二:原地转置(方阵)

classSolution{/** * 原地转置矩阵 - 仅用于方阵 (m == n) * * @param matrix 输入的方阵 * @return 转置后的方阵(原地修改) * * 仅用于方阵,对于非方阵无法原地转置, * 转置后矩阵维度会发生变化 */publicint[][]transposeInPlace(int[][]matrix){intn=matrix.length;// 只遍历上三角部分,避免重复交换for(inti=0;i<n;i++){for(intj=i+1;j<n;j++){// 交换 matrix[i][j] 和 matrix[j][i]inttemp=matrix[i][j];matrix[i][j]=matrix[j][i];matrix[j][i]=temp;}}returnmatrix;}/** * 根据是否为方阵选择不同策略 */publicint[][]transpose(int[][]matrix){intm=matrix.length;intn=matrix[0].length;// 如果是方阵,原地转置if(m==n){returntransposeInPlace(matrix);}else{// 非方阵必须创建新矩阵int[][]transposed=newint[n][m];for(inti=0;i<m;i++){for(intj=0;j<n;j++){transposed[j][i]=matrix[i][j];}}returntransposed;}}}

算法分析

  • 时间复杂度:O(m × n)

    • 需要访问原矩阵的每个元素一次
    • 无论是否为方阵,都需要处理所有 m × n 个元素
  • 空间复杂度

    • 创建新矩阵:O(m × n)
      • 需要创建一个新的 n × m 矩阵存储结果
    • 原地转置(方阵):O(1)
      • 只使用常数额外空间,直接在原矩阵上操作

算法过程

1:方阵转置

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

  1. m = 3, n = 3
  2. 创建 transposed[3][3]
  3. 遍历过程:
    • (0,0): transposed[0][0] = matrix[0][0] = 1
    • (0,1): transposed[1][0] = matrix[0][1] = 2
    • (0,2): transposed[2][0] = matrix[0][2] = 3
    • (1,0): transposed[0][1] = matrix[1][0] = 4
    • (1,1): transposed[1][1] = matrix[1][1] = 5
    • (1,2): transposed[2][1] = matrix[1][2] = 6
    • (2,0): transposed[0][2] = matrix[2][0] = 7
    • (2,1): transposed[1][2] = matrix[2][1] = 8
    • (2,2): transposed[2][2] = matrix[2][2] = 9

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

2:非方阵转置

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

  1. m = 2, n = 3
  2. 创建 transposed[3][2]
  3. 遍历过程:
    • 第0行:transposed[0][0]=1, transposed[1][0]=2, transposed[2][0]=3
    • 第1行:transposed[0][1]=4, transposed[1][1]=5, transposed[2][1]=6

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

测试用例

publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:3x3方阵int[][]matrix1={{1,2,3},{4,5,6},{7,8,9}};int[][]result1=solution.transpose(matrix1);System.out.println("Test 1: "+Arrays.deepToString(result1));// 输出: [[1,4,7],[2,5,8],[3,6,9]]// 测试用例2:2x3非方阵int[][]matrix2={{1,2,3},{4,5,6}};int[][]result2=solution.transpose(matrix2);System.out.println("Test 2: "+Arrays.deepToString(result2));// 输出: [[1,4],[2,5],[3,6]]// 测试用例3:3x2非方阵int[][]matrix3={{1,2},{3,4},{5,6}};int[][]result3=solution.transpose(matrix3);System.out.println("Test 3: "+Arrays.deepToString(result3));// 输出: [[1,3,5],[2,4,6]]// 测试用例4:单行矩阵int[][]matrix4={{1,2,3,4,5}};int[][]result4=solution.transpose(matrix4);System.out.println("Test 4: "+Arrays.deepToString(result4));// 输出: [[1],[2],[3],[4],[5]]// 测试用例5:单列矩阵int[][]matrix5={{1},{2},{3}};int[][]result5=solution.transpose(matrix5);System.out.println("Test 5: "+Arrays.deepToString(result5));// 输出: [[1,2,3]]// 测试用例6:1x1矩阵int[][]matrix6={{42}};int[][]result6=solution.transpose(matrix6);System.out.println("Test 6: "+Arrays.deepToString(result6));// 输出: [[42]]// 测试用例7:包含负数的矩阵int[][]matrix7={{-1,-2},{-3,-4},{-5,-6}};int[][]result7=solution.transpose(matrix7);System.out.println("Test 7: "+Arrays.deepToString(result7));// 输出: [[-1,-3,-5],[-2,-4,-6]]}

关键点

  1. 矩阵维度

    • 原矩阵 m × n → 转置矩阵 n × m
    • 处理维度变化,不能直接在原矩阵上操作(除非是方阵)
  2. 索引映射

    • 核心映射:transposed[j][i] = matrix[i][j]
    • 行列坐标互换
  3. 方阵 与 非方阵

    • 方阵:可以原地转置,节省空间
    • 非方阵:创建新矩阵,维度改变
  4. 边界情况处理

    • 单行矩阵:转置后变为单列
    • 单列矩阵:转置后变为单行
    • 1×1矩阵:转置后不变

常见问题

  1. 为什么非方阵不能原地转置?
    • 转置后矩阵的维度发生了变化(m×n → n×m)
    • 原数组的内存布局无法直接容纳新维度的矩阵
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/29 16:38:41

大模型微调全攻略:从零构建高质量数据集!(以电商客服为例)

开篇 我们可能都思考过一个灵魂拷问&#xff1a;RAG和Prompt工程已经能解决很多问题了&#xff0c;为什么还需要做微调呢&#xff1f; 对于电商客服、医疗咨询等对专业度、合规性和品牌调性要求极高的场景&#xff0c;通用大模型会显得懂事但不够专业。&#x1f978; 如果只是想…

作者头像 李华
网站建设 2026/1/3 6:50:42

Anaconda环境备份与恢复

Anaconda环境备份与恢复 在深度学习项目开发中&#xff0c;一个常见的场景是&#xff1a;你花了几天时间配置好了一个完美的实验环境——PyTorch版本对了&#xff0c;CUDA能用&#xff0c;各种自定义库也都装好了。结果第二天重启实例后发现&#xff0c;所有改动都消失了。这种…

作者头像 李华
网站建设 2026/1/10 2:43:39

Markdown添加注释不影响渲染

Markdown 中的注释艺术&#xff1a;在不渲染的前提下保留关键信息 在 AI 工程团队的日常协作中&#xff0c;你是否遇到过这样的场景&#xff1f;一份 Jupyter Notebook 正准备分享给实习生&#xff0c;但里面还留着“这个参数调了三天才跑通”、“别动这块代码&#xff0c;否则…

作者头像 李华
网站建设 2026/1/5 10:19:45

3CRTP0200EC96服务器模块

3CRTP0200EC96 服务器模块3CRTP0200EC96 服务器模块是一款高性能、工业级计算与控制单元&#xff0c;专为数据处理、通信管理及自动化系统设计&#xff0c;提供稳定、高效的计算和网络处理能力。主要特点&#xff1a;高性能计算&#xff1a;配备先进处理器和内存架构&#xff0…

作者头像 李华