AC牛客 BM99 顺时针旋转矩阵

简介: AC牛客 BM99 顺时针旋转矩阵

BM99 顺时针旋转矩阵

题目描述

描述
有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。
给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵。
数据范围:0<n<300,矩阵中的值满足0≤val≤1000

要求:空间复杂度 O(N^2),时间复杂度 O(N^2)
进阶:空间复杂度 O(1),时间复杂度 O(N^2)

示例1
输入:
[[1,2,3],[4,5,6],[7,8,9]],3
返回值:
[[7,4,1],[8,5,2],[9,6,3]]
AI 代码解读

解题思路

1.解法1:利用辅助数组,通过推导,我们知道每一位移动数字位置为:res[j][n-i-1] = mat[i][j];

2.解法2:我们观察,其实顺时针旋转90度,相等于,先按照做左对角线翻转数组,然后再按照列的中轴线翻转数组
实例分析:[[1,2,3],[4,5,6],[7,8,9]],3
在这里插入图片描述

实践代码

解法1

空间复杂度 O(N^2),时间复杂度 O(N^2)

import java.util.*;

public class Solution {
    public int[][] rotateMatrix(int[][] mat, int n) {
        int[][] res = new int[n][n]; //辅助数组
        for (int i = 0; i < res.length; i++) {
            for (int j = 0; j < res.length; j++) {
                res[j][n-i-1] = mat[i][j];
            }
        }
        return res;
    }
}
AI 代码解读

解法2

空间复杂度 O(1),时间复杂度 O(N^2)

import java.util.*;

public class Solution {
    public int[][] rotateMatrix(int[][] mat, int n) {
        //按照做左对角线翻转数组
        for (int i = 0; i < mat.length; i++) {
            for (int j = i; j < mat.length; j++) {
                int temp = mat[i][j];
                mat[i][j] = mat[j][i];
                mat[j][i] = temp;
            }
        }
        //再按照列的中轴线翻转数组
        for (int i = 0; i < mat.length / 2; i++) {
            for (int j = 0; j < mat.length; j++) {
                int temp = mat[j][i];
                mat[j][i] = mat[j][n - i - 1];
                mat[j][n - i - 1] = temp;
            }
        }
        return mat;
    }
}
AI 代码解读
目录
打赏
0
0
0
0
30
分享
相关文章
|
6月前
lanqiao OJ 644 方格分割
lanqiao OJ 644 方格分割
41 1
|
6月前
lanqiao OJ 664 方格填数
lanqiao OJ 664 方格填数
29 1
|
6月前
acwing 173 矩阵距离
acwing 173 矩阵距离
32 0
|
6月前
【九度 OJ 06】2.7输出梯形
【九度 OJ 06】2.7输出梯形
26 0
|
11月前
力扣 790. 多米诺和托米诺平铺(一维dp)
力扣 790. 多米诺和托米诺平铺(一维dp)
|
11月前
【每日一题Day247】LC1401圆和矩形是否有重叠 | 数学
【每日一题Day247】LC1401圆和矩形是否有重叠 | 数学
68 0
剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)
剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)
华为机试HJ88:扑克牌大小
华为机试HJ88:扑克牌大小
142 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等