【剑指offer】NC18 顺时针旋转矩阵 [Go语言]

454 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。

给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵。 数据范围:0 < n < 300,0<n<300,矩阵中的值满足 0≤val≤1000 要求:空间复杂度 O(N^2),时间复杂度 O(N^2) 进阶:空间复杂度 O(1),时间复杂度 O(N^2)

示例

输入:[[1,2,3],[4,5,6],[7,8,9]],3 
返回值:[[7,4,1],[8,5,2],[9,6,3]]

AC Code

法一:

我们可以只需要将这个矩阵沿着对角线对折交换,然后对各个切片中的元素进行调换即可,这个原理和我们矩阵的转置有点像。

func rotateMatrix( mat [][]int ,  n int ) [][]int {
    for i:=0;i<n;i++{
        for j:=0;j<i;j++{
(1)            mat[i][j],mat[j][i] = mat[j][i],mat[i][j]
        }
    }
    for i := 0; i < n; i++ {
(2)        reserve(mat[i])
    }
    return mat
}

func reserve(slice []int) []int {
    for i:=0;i<len(slice)/2;i++{
        slice[i],slice[len(slice)-1-i] = slice[len(slice)-1-i], slice[i]
    }
    return slice
}
  • (1) 这里我们先沿着左对角线进行一次替换
  • (2) 然后再对每一个列表,行内的调换

法二:

其实我们发现只要把循环的将mat[i][j]旋转到mat[j][n-i-1]的位置,即可得到最终旋转90度的结果了。

func rotateMatrix( mat [][]int ,  n int ) [][]int {
    res:=make([][]int,n)
    for i:=0;i<n;i++{
(1)        res[i] = make([]int,n)
    }
    for j:=0;j<n;j++ {
        for i:=n-1;i>=0;i-- {
(2)            res[j][n-i-1]=mat[i][j]
        }
    }
    return res
}
  • (1) 切片开辟新空间
  • (2) 这里进行一次从左下角开始旋转扫描,就是我们所需要的结果了。