数组元素顺时针旋转
leetcode:48. 旋转图像
难度中等
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在**原地**旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 2:
给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]
解题思路:
理解问题本质—>对大问题进行抽象,总结变化规律—>实现—>优化运行速度
数组按圈划分单位
确定左上角和右下角坐标,然后“缩圈”
按直角旋转每一层的元素
内层元素同外层操作。直到startX>endX
测试代码:
package main
import "fmt"
func main() {
print := func(nums [][]int) {
for _, v := range nums {
for _, n := range v {
fmt.Print("\t", n)
}
fmt.Println()
}
fmt.Println("---------------")
}
nums := [][]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}
print(nums)
startX ,startY, endX ,endY := 0,0,len(nums[0]) - 1, len(nums[0]) - 1
for startX < endX {
for i := 0; i < endX-startX; i++ {
nums[startX][startY+i], nums[endX-i][startY], nums[endX][endY-i], nums[startX+i][endY] =
nums[endX-i][startY], nums[endX][endY-i], nums[startX+i][endY], nums[startX][startY+i]
}
startX,startY,endX,endY = startX+1,startY+1,endX-1,endY-1
}
print(nums)
}
/*
00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33
tmp=00
00=30
30=33
33=03
03=tmp
*/
leetcode提供的函数入口,我替换了参数变量
func rotate(nums [][]int) {
startX ,startY, endX ,endY := 0,0,len(nums[0]) - 1, len(nums[0]) - 1
for startX < endX {
for i := 0; i < endX-startX; i++ {
nums[startX][startY+i], nums[endX-i][startY], nums[endX][endY-i], nums[startX+i] [endY] =
nums[endX-i][startY], nums[endX][endY-i], nums[startX+i][endY], nums[startX][startY+i]
}
startX,startY,endX,endY = startX+1,startY+1,endX-1,endY-1
}
}
完整变化图
秀一下