牛客题解 | 顺时针旋转矩阵

news/2025/2/21 10:18:25/文章来源:https://www.cnblogs.com/wc529065/p/18728723

题目

题目链接

题目主要信息:
  • 给定一个\(n*n\)的矩阵,返回其顺时针90度旋转后的结果
举一反三:

学习完本题的思路你可以解决如下题目:

BM97. 旋转数组

方法:倒置翻转(推荐使用)

知识点:矩阵转置

矩阵转置是将上三角矩阵元素与下三角矩阵元素依据对角线位置对称互换,且该过程是可逆的。

思路:

这道题可能需要将矩阵画出来,观察一下旋转后的规律:
alt

乍一看没有啥规律,但是旋转后的第一行是不是与原矩阵的第一列很像,就是其翻转之后的结果,那我们可以再尝试画出一个顺时针90度旋转后每行翻转的矩阵:
alt
然后我们会惊喜得发现,这就是互为转置的两个矩阵。因为转置的可逆性,只要过程逆转,就可以得到顺时针旋转90度后的矩阵了。

具体做法:

  • step 1:遍历矩阵的下三角矩阵,将其与上三角矩阵对应的位置互换,其实就是数组下标交换后的互换。
  • step 2:遍历矩阵每一行,将每一行看成一个数组使用reverse函数翻转。

Java代码实现:

import java.util.*;
public class Solution {public int[][] rotateMatrix(int[][] mat, int n) {int length = mat.length;//矩阵转置for(int i = 0; i < length; ++i){for(int j = 0; j < i; ++j){//交换上三角与下三角对应的元素int temp = mat[i][j];mat[i][j] = mat[j][i];mat[j][i] = temp;}}//每行翻转for (int i = 0; i < length; i++) {for (int j = 0; j < length/2; j++){int temp = mat[i][j];mat[i][j] = mat[i][length - j - 1];mat[i][length - j - 1] = temp;}}return mat;}
}

C++代码实现

class Solution {
public:vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {//矩阵转置for(int i = 0; i < n; i++) for(int j = 0; j < i; j++)//交换上三角与下三角对应的元素swap(mat[i][j], mat[j][i]);//每行翻转for(int i = 0; i < n; i++) reverse(mat[i].begin(), mat[i].end());return mat;}
};

Python实现代码:

class Solution:def rotateMatrix(self , mat: List[List[int]], n: int) -> List[List[int]]:#矩阵转置for i in range(n):for j in range(i):#交换上三角与下三角对应的元素temp = mat[i][j]mat[i][j] = mat[j][i]mat[j][i] = temp#每行翻转for i in range(n):mat[i].reverse()return mat

复杂度分析:

  • 时间复杂度:\(O(n^2)\),转置需要遍历矩阵,逐行翻转也是\(O(n^2)\)
  • 空间复杂度:\(O(1)\),常数级变量,没有使用额外辅助空间

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客题解 | 链表中倒数最后k个结点

牛客输入输出题单题解题目 题目链接 题目的主要信息:一个长度为\(n\)的链表,返回原链表中从倒数第k个节点至尾节点的全部节点 如果该链表长度小于k,请返回一个长度为 0 的链表举一反三: 学习完本题的思路你可以解决如下题目: BM4.合并有序链表 BM5.合并k个已排序的链表 BM…

打造专属任务管理利器:智慧工具私有化部署策略与实践

智慧任务管理工具私有化是指将智慧任务管理工具部署在组织内部的私有服务器或云环境中,以确保数据的安全性、隐私性和完全控制权。以下是对智慧任务管理工具私有化的详细解析: 一、私有化的优势 ● 数据安全:私有化部署确保所有数据存储在组织内部的服务器或私有云中,避免数…

牛客题解 | 设计LFU缓存结构

牛客输入输出题单题解题目 题目链接 题目的主要信息:实现LFU的set与get函数,且复杂度为\(O(1)\) 每次调用这两个函数会给一个频率赋值,超出长度则移除频率最少的,若有频率相同,则移除访问时间最早的举一反三: 学习完本题的思路你可以解决如下题目: BM100. 设计LRU缓存结…

牛客题解 | 设计LRU缓存结构

牛客输入输出题单题解题目 题目链接 题目的主要信息:实现LRU缓存的模拟结构,包括加入函数set,访问函数get 结构有长度限制,加入新数时,超出长度则需要删除最不常访问的,其中set与get都访问 两个函数都是\(O(1)\)举一反三: 学习完本题的思路你可以解决如下题目: BM101. …

牛客题解 | 编辑距离(一)

牛客输入输出题单题解题目 题目链接 题目主要信息:给定两个长度可能不同的字符串,可以对第一个字符串增删改字符 求增删改的最少次数,让第一个字符串变成第二个字符串 字符串中只出现大小写字母举一反三: 学习完本题的思路你可以解决如下题目: BM65 最长公共子序列(二) BM6…

网上学习导航

推荐一个网上学习好玩的地方 学吧导航 网站截图

解决 windows 安装centos7虚拟机 每隔一段时间 虚拟机ip会变动 怎么固定他的ip

查看当前虚拟机的ip地址:我的是192.168.217.136然后获取到网关ip:打开 VMware Workstation,选中你要设置的虚拟机,点击 “编辑” -> “编辑虚拟机设置”。通过ipconfig 可以看到我的是ens160 我的文件就是 ifcfg-ens160 ,然后使用以下命令进行操作sudo nano /etc/sysco…

牛客题解 | 求二叉树的层序遍历

牛客输入输出题单题解题目 题目链接 题目的主要信息:将给定二叉树按行从上到下、从左到右的顺序输出 输出到一个二维数组中,数组中每行就是二叉树的一层举一反三: 学习完本题的思路你可以解决如下题目: BM27. 按之字形顺序打印二叉树 BM35. 判断是否是完全二叉树 方法一:非…

牛客题解 | 没有重复项数字的全排列

牛客输入输出题单题解题目 题目链接 题目主要信息:给定一个数组,求这组数字的全排列 数组无重复元素 以数字在数组中的位置靠前为优先级,按字典序排列输出举一反三: 学习完本题的思路你可以解决如下题目: BM56. 有重复项数字的全排列 BM58. 字符串的排列 BM60. 括号生成 递…

牛客题解 | 最长无重复子数组

牛客输入输出题单题解题目 题目链接 题目主要信息:题目给定一个数组,要找到其中最长的无重复的子数组的长度 子数组必须是数组中连续的一段举一反三: 学习完本题的思路你可以解决如下题目: BM90. 最小覆盖子串 方法:滑动窗口(推荐使用) 知识点1:滑动窗口 滑动窗口是指在数…

牛客题解 | 最长的括号子串

牛客输入输出题单题解题目 题目链接 题目主要信息:一个长度为\(n\)的仅包含左右括号的字符串 计算最长的格式正确的括号子串的长度举一反三: 学习完本题的思路你可以解决如下题目: BM65 最长公共子序列(二) BM66.最长公共子串 BM71.最长上升子序列(一) BM73 最长回文子串 BM…

牛客题解 | 最长公共前缀

牛客输入输出题单题解题目 题目链接 题目主要信息:给定一个字符串数组,其中有n个字符串,求所有字符串的最长公共前缀 公共前缀是指所有字符串都共有的前面部分的子串,从第一个字符开始举一反三: 学会了本题的思路,你将可以解决类似的字符串问题: BM83. 字符串变形 BM85. …