题目:
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
}