当前位置: 首页 > article >正文

用100道题拿下你的算法面试(矩阵篇-2):求转置矩阵

一、面试问题给定一个二维矩阵 mat [][]计算其转置矩阵。矩阵的转置是通过将原矩阵的所有行转换为列、所有列转换为行得到的。示例 1输入以下矩阵mat[][] [ [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4] ]得到以下输出[ [1, 2, 3 ,4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4] ]解释如下输出为输入矩阵的转置其中每一行变为一列。该重排方式使得原矩阵中的竖直模式在结果中变为水平模式。示例 2输入以下矩阵mat[][] [ [1, 2], [9, -2] ]得到以下输出[ [1, 9], [2, -2] ]解释如下输出为输入矩阵的转置其中每一行变为一列。该重排方式使得原矩阵中的竖直模式在结果中变为水平模式。二、【解法一】暴力法求解矩阵转置 —— 时间复杂度 O (m*n)空间复杂度 O (m*n)(一) 解法思路该思路是创建一个新矩阵通过交换索引将原矩阵的行转换为列 —— 原矩阵中位置 [i][j] 上的元素在转置矩阵中变为 [j][i]。逐步骤实现初始化一个大小为 m × n 的新矩阵行列互换。遍历原矩阵的每一个元素。将原矩阵中第 r 行第 c 列的每个元素赋值给新矩阵中第 c 行第 r 列的位置。返回新的转置矩阵。(二) 使用 5 种语言实现1. C#include iostream #include vector using namespace std; vectorvectorint transpose(vectorvectorint mat) { int rows mat.size(); int cols mat[0].size(); // 创建一个 cols 行 rows 列的结果矩阵用于存储转置矩阵 vectorvectorint tMat(cols, vectorint(rows)); // 通过将行与列互换填充转置矩阵 for (int i 0; i rows; i) { for (int j 0; j cols; j) { // 赋值转置后的值 tMat[j][i] mat[i][j]; } } return tMat; } int main() { vectorvectorint mat { {1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}, {4, 4, 4, 4} }; vectorvectorint res transpose(mat); for (auto row : res) { for (auto elem : row) { cout elem ; } cout \n; } return 0; }2. Javaimport java.util.ArrayList; import java.util.Scanner; public class DSA { public static ArrayListArrayListInteger transpose(int[][] mat) { int rows mat.length; int cols mat[0].length; // 创建一个 cols 行 rows 列的结果矩阵用于存储转置矩阵 ArrayListArrayListInteger tMat new ArrayList(); // 通过将行与列互换填充转置矩阵 for (int i 0; i cols; i) { ArrayListInteger row new ArrayList(); for (int j 0; j rows; j) { // 赋值转置后的值 row.add(mat[j][i]); } tMat.add(row); } return tMat; } public static void main(String[] args) { int[][] mat { {1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}, {4, 4, 4, 4} }; ArrayListArrayListInteger res transpose(mat); for (ArrayListInteger row : res) { for (int elem : row) { System.out.print(elem ); } System.out.println(); } } }3. Pythondef transpose(mat): rows len(mat) cols len(mat[0]) # 创建一个 cols 行 rows 列的结果矩阵用于存储转置矩阵 tMat [[0 for _ in range(rows)] for _ in range(cols)] # 通过将行与列互换填充转置矩阵 for i in range(rows): for j in range(cols): # 赋值转置后的值 tMat[j][i] mat[i][j] return tMat if __name__ __main__: mat [[1, 1, 1, 1],[2, 2, 2, 2],[3, 3, 3, 3], [4, 4, 4, 4]] res transpose(mat) for row in res: for elem in row: print(elem, end ) print()4. C#using System; using System.Collections.Generic; public class DSA { public static ListListint transpose(int[,] mat) { int rows mat.GetLength(0); int cols mat.GetLength(1); // 创建一个 cols 行 rows 列的结果矩阵用于存储转置矩阵 ListListint tMat new ListListint(); // 通过将行与列互换填充转置矩阵 for (int j 0; j cols; j) { Listint row new Listint(); for (int i 0; i rows; i) { // 赋值转置后的值 row.Add(mat[i, j]); } tMat.Add(row); } return tMat; } public static void Main() { int[,] mat { {1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}, {4, 4, 4, 4} }; ListListint res transpose(mat); int rows res.Count; int cols res[0].Count; for (int i 0; i rows; i) { for (int j 0; j cols; j) { Console.Write(res[i][j] ); } Console.WriteLine(); } } }5. JavaScriptfunction transpose(mat) { const rows mat.length; const cols mat[0].length; // 创建一个 cols 行 rows 列的结果矩阵用于存储转置矩阵 const tMat new Array(cols).fill(0).map(() new Array(rows).fill(0)); // 通过将行与列互换填充转置矩阵 for (let i 0; i rows; i) { for (let j 0; j cols; j) { // 赋值转置后的值 tMat[j][i] mat[i][j]; } } return tMat; } // 测试代码 const mat [[1, 1, 1, 1],[2, 2, 2, 2],[3, 3, 3, 3], [4, 4, 4, 4]]; const res transpose(mat); for (const row of res) { console.log(row.join( )); }(三)代码输出和算法复杂度输出1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4时间复杂度O(m*n)空间复杂度O(m*n)三、【解法二】适用于方阵的常量空间解法 —— 时间复杂度 O (m*n)空间复杂度 O (1)(一)解法思路这种方法仅适用于方阵行数与列数相等的矩阵。它被称为原地算法因为无需使用任何额外空间即可完成矩阵转置。实现步骤① 初始化两层嵌套循环外层循环i从 0 到 n-1内层循环j从 i1 到 n-1这样可以避开对角线元素和已经交换过的位置。② 交换元素对每一对位置(i, j)交换mat[i][j]和mat[j][i]这会让元素沿着主对角线对称互换③ 持续交换直到所有上三角区域的元素都与对应的下三角元素完成互换。(二) 使用 5 种语言实现1. C#include iostream #include vector using namespace std; vectorvectorint transpose(vectorvectorint mat) { int n mat.size(); // 遍历矩阵的上三角部分 for (int i 0; i n; i) { for (int j i 1; j n; j) { // 沿对角线交换元素 swap(mat[i][j], mat[j][i]); } } return mat; } int main() { vectorvectorint mat { {1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3 ,3}, {4, 4, 4, 4} }; vectorvectorint res transpose(mat); for (const auto row : res) { for (int elem : row) { cout elem ; } cout endl; } return 0; }2. Javaimport java.util.Arrays; class DSA { public static int[][] transpose(int[][] mat) { int n mat.length; // 遍历矩阵的上三角部分 for (int i 0; i n; i) { for (int j i 1; j n; j) { // 沿对角线交换元素 int temp mat[i][j]; mat[i][j] mat[j][i]; mat[j][i] temp; } } return mat; } public static void main(String[] args) { int[][] mat { {1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3, 3}, {4, 4, 4, 4} }; int[][] res transpose(mat); for (int[] row : res) { for (int elem : row) { System.out.print(elem ); } System.out.println(); } } }3. Pythondef transpose(mat): # 行数因为是方阵行和列数相等 n len(mat) # 遍历矩阵的上三角部分 for i in range(n): for j in range(i 1, n): # 沿对角线交换元素 mat[i][j], mat[j][i] mat[j][i], mat[i][j] return mat if __name__ __main__: mat [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]] res transpose(mat) for row in res: print( .join(map(str, row)))4. C#using System; using System.Collections.Generic; public class DSA { public static ListListint transpose(int[,] mat) { // 行数和列数 int rows mat.GetLength(0); int cols mat.GetLength(1); ListListint result new ListListint(); // 构建转置矩阵 for (int j 0; j cols; j) { Listint row new Listint(); for (int i 0; i rows; i) { row.Add(mat[i, j]); } result.Add(row); } return result; } public static void Main() { int[,] mat { {1, 1, 1, 1}, {2, 2, 2, 2}, {3, 3, 3 ,3}, {4, 4, 4, 4} }; ListListint res transpose(mat); int rows res.Count; int cols res[0].Count; for (int i 0; i rows; i) { for (int j 0; j cols; j) { Console.Write(res[i][j] ); } Console.WriteLine(); } } }5. JavaScriptfunction transpose(mat) { // 行数因为是方阵行和列数相等 const n mat.length; // 遍历矩阵的上三角部分 for (let i 0; i n; i) { for (let j i 1; j n; j) { // 沿对角线交换元素 let temp mat[i][j]; mat[i][j] mat[j][i]; mat[j][i] temp; } } return mat; } // 测试代码 const mat [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]; const res transpose(mat); for (const row of res) { console.log(row.join( )); }(三)代码输出和算法复杂度输出1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4时间复杂度O(m*n)空间复杂度O(1)

相关文章:

用100道题拿下你的算法面试(矩阵篇-2):求转置矩阵

一、面试问题给定一个二维矩阵 mat [][],计算其转置矩阵。矩阵的转置是通过将原矩阵的所有行转换为列、所有列转换为行得到的。示例 1:输入以下矩阵:mat[][] [[1, 1, 1, 1],[2, 2, 2, 2],[3, 3, 3, 3],[4, 4, 4, 4] ]得到以下输出&#xff1…...

数据分析避坑指南:皮尔逊相关系数=0,真的代表两个变量没关系吗?

数据分析避坑指南:皮尔逊相关系数0,真的代表两个变量没关系吗? 刚入行的数据分析师小王最近遇到一个奇怪现象:他计算了两个变量的皮尔逊相关系数,结果显示为0。按照教科书上的解释,这两个变量应该"不相…...

LayerDivider:如何实现单张插画智能分层的终极解决方案

LayerDivider:如何实现单张插画智能分层的终极解决方案 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 面对复杂的数字插画作品,设…...

【限时开放】SITS2026内部生成模型微调手册泄露版:3类业务场景Prompt工程模板+12个生产环境Guardrail规则(仅剩87份)

第一章:SITS2026案例:AI云原生代码生成 2026奇点智能技术大会(https://ml-summit.org) 场景背景与架构演进 SITS2026项目是面向金融合规审计场景的AI增强型云原生平台,其核心能力在于实时将自然语言审计需求(如“生成符合GDPR第…...

保姆级教程:用Python+Mayavi搞定KITTI点云与图像联合可视化(附避坑指南)

PythonMayavi实战:KITTI点云与图像联合可视化全流程解析 刚接触KITTI数据集的开发者们,是否曾被那些炫酷的点云可视化效果吸引,却在环境配置环节屡屡碰壁?从Python环境搭建到Mayavi库的版本兼容,从点云投影错位到3D框显…...

ROHM罗姆推出支持10Gbps以上高速I/F的ESD保护二极管的特点和应用方案

全球知名半导体制造商ROHM(总部位于日本京都市)宣布,推出兼具业界超低动态电阻(Rdyn)*1和超低电容特性的ESD(静电放电)保护二极管*2“RESDxVx系列”。该系列产品适用于需要高速数据传输的众多应用领域。 近年来,在工业设备和车载市场,高速信号传输的普及与电子设备的小…...

Milliohm毫欧电子高精度合金电阻与电流采样解决方案

毫欧电子(Milliohm)‌ 是一家专注于高精度合金电阻与电流采样解决方案的国家级高新技术企业,深耕电子元器件领域多年,主打‌低温漂、高精密、车规级‌的电阻与分流器产品,广泛应用于新能源、工业控制、智能电表、汽车电子等高可靠性场景。 🔧 核心产品线一览 车规级分…...

【SketchUp 2021】材质贴图进阶实战:从别针操控到复杂曲面投影的完整工作流

1. 材质贴图基础操作全解析 刚接触SketchUp材质贴图时,很多人会陷入一个误区——以为贴图就是简单地把图片"贴"到模型表面。其实就像贴墙纸一样,贴图也需要考虑对齐、比例和接缝处理。我刚开始做室内设计时,经常遇到地砖纹理错位、…...

Bili2text:如何用3分钟将B站视频转为可编辑文字稿

Bili2text:如何用3分钟将B站视频转为可编辑文字稿 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 你是否曾为整理B站网课笔记而反复拖动进度条&am…...

终极指南:5步快速解锁中兴光猫超级权限的专业工具

终极指南:5步快速解锁中兴光猫超级权限的专业工具 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu zteOnu是一款专为网络管理员和高级用户设计的开源工具,能够高…...

语音合成技术实践

语音合成技术实践:让机器开口说话 在人工智能飞速发展的今天,语音合成技术(TTS)已成为人机交互的重要桥梁。从智能助手的有声应答到影视配音的自动化处理,合成语音正逐渐融入日常生活。这项技术通过算法模拟人类发声&…...

深度拆解Muduo库的Reactor模型实现与线程间协作机制

1. Muduo库与Reactor模型基础 第一次接触Muduo库时,我被它简洁高效的代码风格所吸引。作为C高性能网络库的代表作,Muduo采用了经典的Reactor模式来处理高并发网络请求。简单来说,Reactor模式就像是一个高效的"事件分发器"&#xff…...

从科研到临床:.nii.gz文件在AI医疗模型实战中的完整处理流水线(附避坑指南)

从科研到临床:.nii.gz文件在AI医疗模型实战中的完整处理流水线(附避坑指南) 医学影像AI模型的开发过程中,数据预处理环节往往决定了项目的成败。作为医学影像领域的事实标准格式,.nii.gz文件承载着从原始扫描数据到模型…...

避坑指南:Zephyr工作队列(Workqueue)的5个常见误用与性能调优(基于2.2.99版本)

Zephyr工作队列深度避坑:2.2.99版本实战调优手册 在嵌入式开发中,Zephyr RTOS的工作队列(Workqueue)机制是处理异步任务的利器,但许多开发者往往在看似简单的API背后踩中意想不到的"地雷"。我曾亲眼见证一个智能家居项目因工作队列…...

【限免解密】:2026奇点大会未发布PPT节选——AGI生成艺术的版权归属、伦理红线与法律真空地带(仅开放72小时)

第一章:2026奇点智能技术大会:AGI与艺术创作 2026奇点智能技术大会(https://ml-summit.org) 本届大会首次设立“AGI原生艺术工坊”,聚焦具备自主意图建模与跨模态反思能力的通用人工智能系统在视觉、音乐与叙事创作中的前沿实践。多位研究者…...

大语言模型技术指南:temperature、top-k、top-p、repeat penalty 到底怎么调?生成参数实战详解

大语言模型技术指南:temperature、top-k、top-p、repeat penalty 到底怎么调?生成参数实战详解 前面几篇,我们已经把这条主线往前推进到了这里:Transformer 为什么能成为大模型基础架构预训练到底在学什么SFT、RLHF、DPO 这类对齐…...

人工智能 机器学习中矩阵的逆势什么呢?

一、什么是矩阵的逆矩阵?(课时 1 配套知识点) 定义 对于一个方阵 A(行数 列数)如果存在另一个矩阵 A −1 ,满足: AA −1 A −1 AE E 是单位矩阵(对角线 1,其余 0&#x…...

IF=10.5!广东省中医院学者研究证实,加用【中药麻杏藿翘颗粒】治疗肺炎,疗效更佳

分享中医药研究进展点击名片,关注我们源自风暴统计网:一键统计分析与绘图的AI网站近期,广东省中医院潘胡丹教授团队开展了一项临床试验,试验成果发表在《Pharmacological Research》期刊(医学一区,IF 10.5…...

性能测试工具JMeter使用入门

一、测试计划: 用来描述一个压力/性能测试脚本和场景设计的基本运行单元, 使用JMeter进行测试的所有内容都是基于一个测试计划 用户定义变量 测试计划的基础配置: 不勾选:各个线程组并行、随机执行 勾选:线程组按照…...

构建有效的性能测试,从准备到执行的全面指南

而本文讲系统的介绍,如何进行有效性能测试的基础,将从以下几个方面来介绍: 应用环境的准备工作 如何冻结代码变更 设计性能测试环境 设计合理的性能测试目标 梳理关键业务测试场景和开发测试脚本 如何准备/管理性能测试数据 如何…...

OpenClaw 飞书机器人对接全教程|Windows 端可视化配置 + 避坑指南(2026 最新)

前言 OpenClaw(小龙虾 AI)打通飞书通讯链路后,可在飞书单聊 / 群聊中直接下达指令,实现本地 AI 自动化办公,无需切换窗口。Windows 端部署已支持可视化配置 零命令行,无需手动敲代码,全程鼠标…...

Grafana Tempo介绍(分布式追踪后端系统,用于存储和查询追踪数据)OpenTelemetry、OTLP、无索引、TraceID查询、低成本、依赖对象存储、Exemplars

文章目录一文读懂 Tempo:云原生时代的分布式追踪后端一、什么是 Tempo?二、Tempo 在可观测性体系中的位置三、Tempo 的核心设计理念1. 无索引(Index-free)为什么这么设计?2. 对象存储优先3. 与 Metrics 强关联&#xf…...

Jaeger介绍(微服务架构分布式追踪利器,Distributed Tracing)(Trace追踪、Span跨度、Context上下文)OpenTelemetry、服务网格Istio、Tempo

文章目录 Jaeger 入门与实践:分布式追踪的利器一、什么是 Jaeger?二、核心概念1. Trace(追踪)2. Span(跨度)3. Context(上下文) 三、Jaeger 架构解析1. Client(客户端&am…...

OpenTelemetry(OTel)介绍(开源可观测性框架,统一采集和导出指标、日志、链路追踪)OTLP协议、自动埋点、采集标准、三层架构:APISDK、Collector、Backend

OTLP协议:OTLP(OpenTelemetry Protocol) 是 OpenTelemetry 协议的缩写,是 OpenTelemetry 项目定义的原生数据传输协议。 文章目录OpenTelemetry 入门与实践指南一、什么是 OpenTelemetry?二、为什么需要 OpenTelemetry…...

蓝牙音箱开发避坑:山景BP1048后台运行参数详解(附SDK配置截图)

山景BP1048蓝牙音箱后台运行模式深度解析与实战配置 蓝牙音箱开发中,后台运行功能的设计往往成为硬件工程师的痛点。当用户切换到U盘模式时,传统方案会直接关闭蓝牙连接,导致音乐播放中断——这种体验在车载音响、智能家居等多场景切换应用中…...

鸿蒙游戏,会不会重演微信小游戏的爆发?

网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…...

提示工程(Prompt Engineering)完整指南:从原子结构到工业级实践——AI智能体开发实战

提示工程不是“写好一句话让AI听话”,而是在模型能力边界内构建可复现、可验证、可演进的人机契约系统。它融合语言学建模、认知心理学、软件工程与领域知识,是当前大模型落地最核心的底层能力。以下按概念解构 → 结构拆解 → 技术分层 → 场景映射 → …...

秒杀系统整体架构怎么设计?一次讲清限流、削峰、库存、幂等与高并发链路

秒杀系统整体架构怎么设计?一次讲清限流、削峰、库存、幂等与高并发链路 大家好,我是一名有 4 年工作经验的 Java 后端开发。 秒杀几乎是高并发系统里最经典的话题之一。 但很多文章只讲某一个点,比如 Redis 扣库存,真正完整的秒杀…...

AI智能体开发核心概念全解析

AI智能体开发核心概念详解:提示词工程、技能系统、架构设计与完整教程 AI智能体(AI Agent)并非“会聊天的大模型”,而是具备感知(Observation)、推理(Reasoning)、决策(…...

Redis、MySQL、价格刷新、下单校验:购物车系统一次讲透

电商购物车怎么设计?一次讲清存储模型、价格刷新、勾选状态与并发更新思路 大家好,我是一名有 4 年工作经验的 Java 后端开发。 购物车看起来像电商系统里最普通的模块,但真正做过的人都知道,它其实连接着商品、库存、价格、优惠、…...