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

题目

题目链接

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

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

BM97. 旋转数组

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

知识点:矩阵转置

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

思路:

这道题可能需要将矩阵画出来,观察一下旋转后的规律:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

乍一看没有啥规律,但是旋转后的第一行是不是与原矩阵的第一列很像,就是其翻转之后的结果,那我们可以再尝试画出一个顺时针90度旋转后每行翻转的矩阵:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
然后我们会惊喜得发现,这就是互为转置的两个矩阵。因为转置的可逆性,只要过程逆转,就可以得到顺时针旋转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(n2),转置需要遍历矩阵,逐行翻转也是 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( 1 ) O(1) O(1),常数级变量,没有使用额外辅助空间
### 关于 HJ39 题目蛇形矩阵的 C 语言实现 对于给定的问题,可以采用双重循环结构来构建所需的蛇形矩阵。此方法通过计算每一项的位置并填充相应的数值完成矩阵构造。 下面是一个完整的解决方案: ```c #include <stdio.h> int main() { int n; scanf("%d", &n); // 创建二维数组存储结果 int matrix[n][n]; // 初始化计数器变量用于生成序列中的下一个数字 int currentNumber = 1; for (int layer = 0; layer < n; ++layer) { for (int row = layer, col = 0; row >= 0 && col <= layer; --row, ++col) { if (row < n && col < n){ matrix[row][col] = currentNumber++; } } for (int col = layer + 1, row = 0; col < n && row <= layer; ++col, --row) { if (row >= 0 && col < n){ matrix[row][col] = currentNumber++; } } } // 打印最终的结果矩阵 for (int i = 0; i < n; ++i) { for (int j = 0; j <= i; ++j) { printf("%d ", matrix[i - j][j]); } printf("\n"); } return 0; } ``` 上述代码实现了如下功能: - 使用 `scanf` 函数读取用户输入的正整数 N。 - 定义了一个大小为 N×N 的二维数组用来保存生成的蛇形矩阵。 - 利用两个嵌套循环按照特定模式遍历整个矩阵,并按顺序填入连续增加的自然数。 - 最后再次利用两层循环输出形成的蛇形矩阵,注意这里只打印下三角部分[^1]。 #### 注意事项 该程序假设输入的是有效范围内的正整数(即不超过100)。如果需要处理更广泛的边界情况,则应适当调整逻辑以适应这些需求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值