排序题目:将矩阵按对角线排序

news2024/12/26 22:25:54

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 前言
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:将矩阵按对角线排序

出处:1329. 将矩阵按对角线排序

难度

5 级

题目描述

要求

矩阵对角线是一条从矩阵最上面行或者最左侧列中的某个元素开始的对角线,沿右下方向一直到矩阵末尾的元素。例如,矩阵 mat \texttt{mat} mat 6 \texttt{6} 6 3 \texttt{3} 3 列,从 mat[2][0] \texttt{mat[2][0]} mat[2][0] 开始的矩阵对角线将会经过 mat[2][0] \texttt{mat[2][0]} mat[2][0] mat[3][1] \texttt{mat[3][1]} mat[3][1] mat[4][2] \texttt{mat[4][2]} mat[4][2]

给定一个 m × n \texttt{m} \times \texttt{n} m×n 的整数矩阵 mat \texttt{mat} mat,将每条矩阵对角线上的元素按升序排序,返回排序后的矩阵。

示例

示例 1:

示例 1

输入: mat   =   [[3,3,1,1],[2,2,1,2],[1,1,1,2]] \texttt{mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]} mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
输出: [[1,1,1,1],[1,2,2,2],[1,2,3,3]] \texttt{[[1,1,1,1],[1,2,2,2],[1,2,3,3]]} [[1,1,1,1],[1,2,2,2],[1,2,3,3]]

示例 2:

输入: mat   =   [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]] \texttt{mat = [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]} mat = [[11,25,66,1,69,7],[23,55,17,45,15,52],[75,31,36,44,58,8],[22,27,33,25,68,4],[84,28,14,11,5,50]]
输出: [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]] \texttt{[[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]} [[5,17,4,1,52,7],[11,11,25,45,8,69],[14,23,25,44,58,15],[22,27,31,36,50,66],[84,28,75,33,55,68]]

数据范围

  • m = mat.length \texttt{m} = \texttt{mat.length} m=mat.length
  • n = mat[i].length \texttt{n} = \texttt{mat[i].length} n=mat[i].length
  • 1 ≤ m,   n ≤ 100 \texttt{1} \le \texttt{m, n} \le \texttt{100} 1m, n100
  • 1 ≤ mat[i][j] ≤ 100 \texttt{1} \le \texttt{mat[i][j]} \le \texttt{100} 1mat[i][j]100

前言

这道题要求对给定矩阵的每条矩阵对角线上的元素按升序排序,因此必须对每条矩阵对角线分别排序。

m × n m \times n m×n 的矩阵中有 m + n − 1 m + n - 1 m+n1 条矩阵对角线,最长的矩阵对角线的长度是 min ⁡ ( m , n ) \min(m, n) min(m,n)。在确定 m m m n n n 的情况下,时间复杂度取决于每条矩阵对角线的排序的时间复杂度。由于这道题中 m m m n n n 都不超过 100 100 100,因此可以使用时间复杂度较高的初级排序算法,空间复杂度是 O ( 1 ) O(1) O(1)

此处只给出基于插入排序的矩阵对角线排序,读者可以自行尝试实现基于其他初级排序算法、高级排序算法以及线性时间排序算法的矩阵对角线排序。

解法

思路和算法

m × n m \times n m×n 的矩阵中有 m + n − 1 m + n - 1 m+n1 条矩阵对角线,每条矩阵对角线的起始单元格可能有以下两种情况:

  • 当起始单元格的列下标为 0 0 0 时,起始单元格位于最左侧列;

  • 当起始单元格的行下标为 0 0 0 且列下标大于 0 0 0 时,起始单元格位于最上面行。

为了避免同一条矩阵对角线被重复计算,当起始单元格的行下标为 0 0 0 时不考虑列下标为 0 0 0 的情况。

( startRow , startCol ) (\textit{startRow}, \textit{startCol}) (startRow,startCol) 表示矩阵对角线的起始单元格,则矩阵对角线的长度是 min ⁡ ( m − startRow , n − startCol ) \min(m - \textit{startRow}, n - \textit{startCol}) min(mstartRow,nstartCol),矩阵对角线中的第 i i i 个元素( i i i 0 0 0 开始)位于单元格 ( startRow + i , startCol + i ) (\textit{startRow} + i, \textit{startCol} + i) (startRow+i,startCol+i)

对每条矩阵对角线使用插入排序,当每条矩阵对角线的排序结束之后,整个矩阵排序结束。

代码

class Solution {
    int m, n;

    public int[][] diagonalSort(int[][] mat) {
        m = mat.length;
        n = mat[0].length;
        for (int i = 0; i < m; i++) {
            diagonalSort(mat, i, 0);
        }
        for (int j = 1; j < n; j++) {
            diagonalSort(mat, 0, j);
        }
        return mat;
    }

    public void diagonalSort(int[][] mat, int startRow, int startCol) {
        int length = Math.min(m - startRow, n - startCol);
        for (int i = 1; i < length; i++) {
            int num = mat[startRow + i][startCol + i];
            int insertIndex = i;
            for (int j = i - 1; j >= 0 && mat[startRow + j][startCol + j] > num; j--) {
                mat[startRow + j + 1][startCol + j + 1] = mat[startRow + j][startCol + j];
                insertIndex = j;
            }
            if (insertIndex != i) {
                mat[startRow + insertIndex][startCol + insertIndex] = num;
            }
        }
    }
}

复杂度分析

  • 时间复杂度: O ( ( m + n ) × min ⁡ ( m , n ) 2 ) O((m + n) \times \min(m, n)^2) O((m+n)×min(m,n)2),其中 m m m n n n 分别是矩阵 mat \textit{mat} mat 的行数和列数。共有 m + n − 1 m + n - 1 m+n1 条矩阵对角线,每条矩阵对角线的插入排序需要 O ( min ⁡ ( m , n ) 2 ) O(\min(m, n)^2) O(min(m,n)2) 的时间,时间复杂度是 O ( ( m + n ) × min ⁡ ( m , n ) 2 ) O((m + n) \times \min(m, n)^2) O((m+n)×min(m,n)2)

  • 空间复杂度: O ( 1 ) O(1) O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2158372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS Linux教程(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑)&#xff0c;然后C盘、D盘。 Linux系统的根目录是/&#xff0c;我们可以使用cd /进入根目录&#xff0c;然后使…

共享打印机,局域网搜不到

如果共享打印机后&#xff0c;局域网内其余机器检索不到 1. 排查 是否启用来宾账户&#xff08;Guest&#xff09; 2. 网络和共享中心->更改高级共享设置->启用网络发现、启用文件和打印机共享、关闭密码保护共享 排查基本可以解决搜索不到打印机问题

Transformer动画讲解

**Transformer工作原理**** **一、**** ******GPT的核心是Transformer******** *GPT* &#xff1a; **GPT&#xff08;Generative Pre-trained Transformer&#xff09;**** ****是一种基于单向Transformer解码器的预训练语言模型&#xff0c;它通过在大规模语料库上的无监督…

MatrixOne 助力某电信运营商构建低成本高性能车联网管理系统

客户基本情况 该电信运营商在物联网领域深耕多年&#xff0c;致力于为企业和个人提供全面的物联网解决方案&#xff0c;包括智能连接、设备管理、数据采集与分析等核心服务。凭借其强大的网络覆盖和技术优势&#xff0c;该运营商为各行业提供高效、安全、可靠的物联网服务&…

风速传感器一文浅谈 了解自然的力量

产品概述 本产品主要采用优质聚合物碳纤维为原材料&#xff0c;具有良好的防腐、防侵蚀等特点&#xff0c;能够保证仪器长期使用不起锈&#xff0c;同时配合内部顺滑的轴承系统&#xff0c;确保了信息采集的准确性。外型小巧轻便&#xff0c;便于携带和组装&#xff0c;三杯设…

MCU和YT9218交换机通过RMII连接

1、可以通过带RMII的MCU和EXT1端口连接&#xff0c;将MCU配置为RMII 100M/全双工就可以通 2、原先在这里改SW配置&#xff0c; 一直不通 3、后来通过api调用可以通 这样改&#xff1a; 在初始化后&#xff0c;添加下面代码 //使能RMII&#xff0c;phy模式 #define Port5 …

【LeetCode】动态规划—使用最小花费爬楼梯(附完整Python/C++代码)

动态规划—#746. 使用最小花费爬楼梯 前言题目描述基本思路1. 问题定义:2. 理解问题和递推关系:3. 解决方法:4. 进一步优化:5. 小总结: 代码实现Python3代码实现Python 代码解释C代码实现C 代码解释 总结: 前言 在这个问题中&#xff0c;我们有一个数组 c o s t [ ] cost[] c…

单细胞SCENIC简单可视化分析学习和整理

SCENIC教程中给出三个方法进行下游的可视化分析&#xff0c;分别可以选择网页(SCope)平台&#xff0c;R或者python进行分析。 1、网页版&#xff1a;https://scope.aertslab.org/ 把数据从左侧工具栏处上传之后就可以个性化分析了~ 2、R和Python就殊途同归啦~ 笔者基于githu…

linux/CentOS 开机启动程序

前言 TencentOS Server 3.1 (TK4)适用于自己编写启动脚本的情况 编写启动脚本 比如启动tomcat&#xff0c;kaijiqidong_tomcat.sh #!/bin/bashecho "kaijiqidong_tomcat on date ." >> kaijiqidong_tomcat.log 2>&1cd /x/xx/xxx sh /x/tomcat/bin/s…

老照片修复软件有哪些?6个工具轻松搞定

在回忆的长廊中&#xff0c;老照片承载着岁月的痕迹和珍贵的记忆。 然而&#xff0c;时间的流逝往往让这些宝贵的瞬间变得模糊不清。幸运的是&#xff0c;现代科技赋予了我们修复这些老照片的能力。 面对市场上众多的老照片自动修复软件&#xff0c;选择一个合适的工具变得尤…

Apache APISIX学习(1):介绍、docker启动

一、介绍 Apache APISIX 是一个动态、实时、高性能的 API 网关&#xff0c; 提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。你可以把 Apache APISIX 当做流量入口&#xff0c;来处理所有的业务数据&#xff0c;包括动态路由、动态上游…

得物自建 Redis 无人值守资源均衡调度设计与实现

目录&#xff1a; 一、为什么要做资源均衡调度 二、为什么要做自动化资源均衡调度 三、如何合理选择迁移节点 四、如何保障迁移过程中可靠性1. 添加从节点2. 检查同步数据正常3. 执行主从切换4. 检查主从切换正常5. 删除待迁移节点6. 消息通知 五、迁移任务管理展示 六、总结 …

户用光伏项目难管理,到底该怎么办?

一、鹧鸪云光伏业务管理软件&#xff1a;一站式管理利器 鹧鸪云光伏业务管理软件&#xff0c;作为一款专为光伏行业量身定制的智能化管理工具&#xff0c;集成了项目管理、运维管理、数据分析、用户服务等多功能模块于一体&#xff0c;旨在通过数字化手段&#xff0c;实现户用…

Nature Genetics|三代测序微量建库技术:媲美WGBS的直接甲基化检测

DNA修饰和甲基化是理解基因调控机制的关键。以往&#xff0c;我们的经验表明&#xff0c;使用三代测序从未经扩增的长DNA模板中同时读取序列信息和碱基修饰&#xff0c;需要投入大量的DNA样本来构建文库。 今天&#xff0c;小编带大家看一篇2024年发表于《Nature Genetics》的…

【MAUI】FlexLayout

文章目录 概述属性方向和对齐方式DirectionWrapJustifyContentAlignItemsAlignContent 圣杯布局来源 概述 FlexLayout弹性布局&#xff0c;和前端的Flex弹性布局&#xff0c;几乎一样。FlexLayout是容器&#xff0c;可以定义Direction/主轴方向、Wrap/子元素在主轴方向上是否换…

Vue使用Vue Router路由:开发单页应用

1、路由基础 在单页 Web 应用中&#xff0c;整个项目只有一个 HTML 文件&#xff0c;不同视图&#xff08;组件的模块&#xff09;的内容都是在同一个页面中渲染的。当用户切换页面时&#xff0c;页面之前的跳转都是在浏览器端完成的&#xff0c;这时就需要使用前端路由。 路…

蒙古语有方言差异吗?

蒙古语存在方言差异&#xff0c;主要分为西部方言和东部方言两大类。西部方言&#xff0c;即蒙古方言或喀尔喀方言&#xff0c;主要在蒙古国使用&#xff0c;是该国的官方语言。东部方言&#xff0c;又称布里亚特方言或巴尔虎-布里亚特方言&#xff0c;主要在中国内蒙古自治区和…

deepin桌面版连接windows远程桌面

在Linux系统中&#xff0c;要登录到Windows系统&#xff0c;通常可以使用远程桌面协议(RDP)。你需要在Linux系统上安装RDP客户端。 使用如下命令安装rdp协议&#xff1a; sudo apt-get install xrdp 安装成功后&#xff0c;启动rdp服务。 sudo systemctl start xrdp 有了r…

vscode缩进 和自动格式化

如下图&#xff0c;缩进太大了。 检查2个地方 prettierrc.cjs文件。此处决定缩进几个tab vscode 的设置。 保存的时候 格式化。

Apache Druid命令执行(CVE-2021-25646)

漏洞详情&#xff1a; Apache Druid 是用Java编写的面向列的开源分布式数据存储系统&#xff0c;旨在快速获取大量事件数据&#xff0c;并在数据之上提供低延迟查询。 Apache Druid含有能够执行嵌入在各种类型请求中由用户提供的JavaScript代码功能。此功能适用于高度信任环境…