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

文章目录

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

题目

标题和出处

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

出处: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.xdnf.cn/news/1543413.html

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

相关文章

【C++代码运行结果测试】基类与派生类的成员变量值的调用结果

【铺垫】派生类对象可被基类指针所指向&#xff0c;效果与被派生类指针指向等效 【代码测试1】15浙工大卷一读程序5题代码改 【代码测试2】C教辅p206例7.21 【代码1】15浙工大卷一读程序5题代码改 #include "bits/stdc.h" #include<iostream> using namesp…

谷歌发布新 RL 方法,性能提升巨大;苹果前设计总监正与 OpenAI 合作开发 AI 设备丨 RTE 开发者日报

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

机器人顶刊IEEE T-RO发布无人机动态环境高效表征成果:基于粒子的动态环境连续占有地图

摘要&#xff1a;本研究有效提高了动态环境中障碍物建模的精度和效率。NOKOV度量动作捕捉系统助力评估动态占用地图在速度估计方面的性能。 近日&#xff0c;上海交通大学、荷兰代尔夫特理工研究团队在机器人顶刊IEEE T-RO上发表题为Continuous Occupancy Mapping in Dynamic …

数据加密和数字证书

1 什么是数据加密 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为"密文",使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程…

人工智能课程实训方案

第一章 发展背景 当今&#xff0c;世界无时无刻不在发生着变化。对于技术领域而言&#xff0c;普遍存在的一个巨大变化就是为大数据&#xff08;Big data&#xff09;打开了大门。随着国家大数据战略推进实施以及配套政策的贯彻落实&#xff0c;大数据产业发展环境进一步优化&a…

Tauri 应用 input 输入自动大写问题定位解决

使用 Tauri React 开发 MinApi(http api接口测试工具) 时&#xff0c;在 Mac 系统中遇到一个很奇怪的问题&#xff1a;在 input 输入框中输入内容时&#xff0c;如果输入的是全小写英文字母&#xff0c;会自动将首字母转换为大写&#xff0c;效果如下图所示。 问题定位 经过排…

JS执行机制(同步和异步)

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。 异步:在做这件事的同时&#xff0c;你还可以去处理其他事 他们的本质区别&#xff1a;这条流水线上各个流程的执行顺序不同。 同步任务 同步任务都在主线程上执行&#xff0c;形成一个执行栈。 异步…

asp.net core grpc快速入门

环境 .net 8 vs2022 创建 gRPC 服务器 一定要勾选Https 安装Nuget包 <PackageReference Include"Google.Protobuf" Version"3.28.2" /> <PackageReference Include"Grpc.AspNetCore" Version"2.66.0" /> <PackageR…

统信服务器操作系统a版e版【dde桌面限制登录次数】介绍

dde桌面登录规则、tty限制登录次数、ssh限制登录次数、ssh限制地点登录、本地限制终端登录、时间限制登录等内容 文章目录 功能概述功能介绍1.查看dde桌面登录规则2.tty限制登录次数3.ssh限制登录次数4.ssh限制地点登录5.本地限制终端登录6.时间限制登录 功能概述 限制dde桌面…

【计算机基础】用bat命令将Unity导出PC包转成单个exe可执行文件

Unity打包成exe可执行文件 上边连接是很久以前用过的方法&#xff0c;发现操作有些不一样了&#xff0c;并且如果按上述操作比较麻烦&#xff0c;所以写了个bat命令。 图1、导出的pc程序 如图1是导出的pc程序&#xff0c;点击exe文件可运行该程序。 添加pack_project.bat文件 …

自学前端的正确姿势是...

师傅带进门&#xff0c;修行在个人。 在前端自学成才的道路上&#xff0c;有些人走的很快&#xff0c;有些人却举步维艰。 为什么会这样子呢&#xff1f;因为他们没有掌握自学前端的正确姿势。 在介绍应该要怎样自学前端之前&#xff0c;首先来看下&#xff0c;自学前端容易…

vue-router路由(重定向,嵌套,动态路由匹配,命名,高亮,守卫)

一、前端路由的概念与原理 路由router就是对应关系。分为前端路由和后端路由。 1后端路由 后端路由指的是&#xff1a;请求方式、请求地址与function处理函数之间的对应关系。在node.js中&#xff0c;express理由的基本用法如下&#xff1a; const express require(expres…

【C语言从不挂科到高绩点】21-指针03-指针与函数【重点知识】

Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节将为大家讲解C语言中非常重要的知识点-指针: 本套课程将会从0基础讲解C语言核心技术,适合人群: 大学中开设了C语言课程的同学想要专升本或者考研的同学想要考计算机等级证书的同学想…

死磕P7: JVM内存划分必知必会(一)

这是「死磕P7」系列第 001 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 JVM 内存区域划分是面试常考点&#xff0c;属于死记硬背型&#xff0c;比较让人头大的是不同版本的 JDK 具有不同的划分方式&…

Shopee虾皮双十大促:广告到底怎么做?需要使用动态代理吗?

在Shopee虾皮下半年的大促活动中&#xff0c;即将到来的10.10超级品牌节就是下半年各个超级购物节的其中一个&#xff0c;抓住本次大促的机会&#xff0c;卖家就有机会在更短的决策时间内实现更高的转化。大促期间最重要的环节之一就是广告投放&#xff0c;而广告投放又有什么技…

公司电脑监控都监控什么?可以看到员工摸鱼吗?电脑监控功能全解析!【2024年必看】

在这个数字化时代&#xff0c;企业对于信息安全和工作效率的追求日益增强。 公司业务规模的扩大&#xff0c;员工数量激增&#xff0c;如何有效管理员工行为、保障企业信息安全成为了每个管理者必须面对的重要课题。 于是&#xff0c;公司电脑监控成为了许多企业的选择&#…

全方位洗衣洗鞋小程序系统,重塑干洗店服务新体验;

全方位洗衣洗鞋小程序系统&#xff0c;重塑干洗店服务新体验; 一、核心功能革新&#xff1a; 1.多元化下单模式&#xff1a;融合上门取送、到店服务、寄存网点及智能衣柜四种便捷方式&#xff0c;用户轻松一键下单&#xff0c;享受个性化服务。 2.从下单到送回&#xff0c;全程…

从零开始讲DDR(3)——DDRC与DDRPYH

一、DDR的使用 在之前的文章中我们介绍了DDR的基本概念&#xff0c;但是DDR内存的操作不仅仅是简单的数据读取和写入&#xff0c;它包括许多时序要求和信号调度。为了让DDR内存有效运作&#xff0c;系统需要在逻辑层和物理层之间进行大量的协作。我们拿出一张DDR的操作简化状态…

YOLOv8改进,YOLOv8 Neck结构引入BiFPN

摘要 模型效率在计算机视觉中变得越来越重要。本文系统地研究了神经网络架构设计选择用于目标检测,并提出了几项关键优化以提高效率。首先,提出了一种加权双向特征金字塔网络(BiFPN),它允许轻松快速的多尺度特征融合;其次,提出了一种复合缩放方法,该方法同时均匀地缩放…