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]]

解题思路

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;
    }
}

解法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;
    }
}
目录
相关文章
|
1月前
HJ17 坐标移动
HJ17 坐标移动
43 0
|
8月前
|
算法 C++
剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)
剑指offer(C++)-JZ29:顺时针打印矩阵(算法-模拟)
|
8月前
华为机试HJ17:坐标移动
华为机试HJ17:坐标移动
|
机器学习/深度学习
【LeetCode】螺旋矩阵&&旋转图像
【LeetCode】螺旋矩阵&&旋转图像
【LeetCode】螺旋矩阵&&旋转图像
|
机器学习/深度学习
AC Leetcode 48. 旋转图像
AC Leetcode 48. 旋转图像
112 0
AC Leetcode 48. 旋转图像
|
测试技术
AC牛客 BM97 旋转数组
AC牛客 BM97 旋转数组
63 0
AC牛客 BM89 合并区间
AC牛客 BM89 合并区间
70 0
AC牛客 BM46 最小的K个数
AC牛客 BM46 最小的K个数
34 0