【数组】BM99 顺时针旋转矩阵

一、题目

牛客题目链接顺时针旋转矩阵_牛客题霸_牛客网

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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值