1914. 循环轮转矩阵

84 阅读1分钟

题目:
leetcode.cn/problems/cy…
算法:
方法一:模拟
坐标转换关系复杂是吧,ok,我一层一层抽出来,然后逆时针移位,最后放回去行了吧

func rotateGrid(grid [][]int, k int) [][]int {
    n , m := len(grid), len(grid[0])
    nlayer := min(m / 2, n / 2)
    ans := make([][]int, n)
    for i := range ans {
        ans[i] = make([]int, m)
    }
    for layer := 0; layer < nlayer; layer ++ {
        count := 2 * (n - 2 * layer) + 2 * (m - 2 * layer) - 4
        tmp := make([]int, 0)
        // 放入tmp
        for j := layer; j < m - layer; j ++ {
            tmp = append(tmp, grid[layer][j])
        }
        for i := layer + 1 ; i < n - layer; i ++ {
            tmp = append(tmp, grid[i][m - layer - 1])
        }
        for j := m - layer - 2; j >= layer; j -- {
            tmp = append(tmp, grid[n - layer - 1][j])
        }
        for i := n - layer - 2; i > layer; i -- {
            tmp = append(tmp, grid[i][layer])
        }
        // 旋转tmp
        kk := k % count
        tmp = append(tmp[kk:], tmp[:kk]...)
        // 放入ans数组
        pos := 0
        for j := layer; j < m - layer; j ++ {
            ans[layer][j] = tmp[pos]
            pos ++
        }
        for i := layer + 1 ; i < n - layer; i ++ {
            ans[i][m - layer - 1] = tmp[pos]
            pos ++
        }
        for j := m - layer - 2; j >= layer; j -- {
            ans[n - layer - 1][j] = tmp[pos]
            pos ++
        }
        for i := n - layer - 2; i > layer; i -- {
            ans[i][layer] = tmp[pos]
            pos ++
        }
        
    }
    return ans
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}