一、题目
牛客题目链接:顺时针旋转矩阵_牛客题霸_牛客网
LeeCode 题目链接:
题目描述:
有一个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)先按左对角线进行翻转;
(2)再把翻转后的二维数组的每个一维数组进行逆序交换。
具体实现:
实例分析:[[1,2,3],[4,5,6],[7,8,9]], 3
矩阵刚开始为:
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
先沿着左对角线做翻转为:
1 | 4 | 7 |
2 | 5 | 8 |
3 | 6 | 9 |
输出为:[[1,4,7],[2,5,8],[3,6,9]]
再将每个一维数组进行逆序翻转得到[[7,4,1],[8,5,2],[9,6,3]]。
最终将矩阵顺时针旋转90度后结果变为:
7 | 4 | 1 |
8 | 5 | 2 |
9 | 6 | 3 |
复杂度分析:
- 时间复杂度为O(N^2)
- 空间复杂度为O(1),没有占用任何存储空间。
代码实现:
golang:
package main
//import "fmt"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param mat int整型二维数组
* @param n int整型
* @return int整型二维数组
*/
func rotateMatrix(mat [][]int, n int) [][]int {
// 对角线元素交换
for i := 0; i < n; i++ {
for j := 0; j < i; j++ {
mat[i][j], mat[j][i] = mat[j][i], mat[i][j]
//swap(mat[i],[j],mat[j][i])
}
}
for i := 0; i < n; i++ {
for j := 0; j < n/2; j++ {
mat[i][j], mat[i][n-1-j] = mat[i][n-1-j], mat[i][j]
}
}
return mat
}
php:
<?php
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param mat int整型二维数组
* @param n int整型
* @return int整型二维数组
*/
function rotateMatrix( $mat , $n )
{
// write code here
// 对角线元素交换
for ($i = 0; $i < $n; $i++) {
for ($j = 0; $j < $i; $j++ ){
[$mat[$i][$j], $mat[$j][$i]] = [$mat[$j][$i], $mat[$i][$j]];
//swap(mat[i],[j],mat[j][i])
}
}
for ($i = 0; $i < $n; $i++ ){
for ($j = 0; $j < $n/2; $j++ ){
[$mat[$i][$j], $mat[$i][$n-1-$j]] = [$mat[$i][$n-1-$j], $mat[$i][$j]];
}
}
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)。
代码实现:
go:
package main
//import "fmt"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param mat int整型二维数组
* @param n int整型
* @return int整型二维数组
*/
func rotateMatrix(mat [][]int, n int) [][]int {
temp := make([][]int, n)
for i := range temp {
temp[i] = make([]int, n)
}
for i, row := range mat {
for j, v := range row {
temp[j][n-i-1] = v
}
}
// 拷贝 tmp 矩阵每行的引用
copy(mat, temp)
return mat
}