1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package main
- func spiralOrder(matrix [][]int) (res []int) {
- if len(matrix) == 0 {
- return
- }
- w, h := len(matrix[0]), len(matrix)
- for x, y := 0, 0; w > 0 && h > 0; w, h, x, y = w-2, h-2, x+1, y+1 {
- if h == 1 {
- // 1 2 3 4
- res = append(res, matrix[y][x:x+w]...)
- return
- } else if w == 1 {
- // 1
- // 2
- // 3
- // 4
- for i := 0; i < h; i, y = i+1, y+1 {
- res = append(res, matrix[y][x])
- }
- return
- }
- // 1 2 3 4 loop1 -> 1 2 3
- // 12 ... 5 loop2 -> 4 5 6
- // 11 ... 6 loop3 -> 7 8 9
- // 10 9 8 7 loop4 -> 10 11 12
- var xSpeed, ySpeed, length int
- for loop := 0; loop < 4; loop++ {
- switch loop {
- case 0:
- xSpeed, ySpeed, length = 1, 0, w-1
- case 1:
- xSpeed, ySpeed, length = 0, 1, h-1
- case 2:
- xSpeed, ySpeed, length = -1, 0, w-1
- default:
- xSpeed, ySpeed, length = 0, -1, h-1
- }
- for i := 0; i < length; i++ {
- res = append(res, matrix[y][x])
- x += xSpeed
- y += ySpeed
- }
- }
- }
- return
- }
- /* func main() {
- m1 := [][]int{
- {11, 22, 33, 44, 55},
- {16, 27, 38, 49, 50},
- {11, 23, 35, 47, 59},
- {12, 24, 36, 48, 50},
- {15, 24, 33, 42, 51},
- }
- fmt.Println(spiralOrder(m1))
- m2 := [][]int{
- {11, 22, 11},
- {16, 27, 33},
- {11, 23, 24},
- {12, 13, 44},
- }
- fmt.Println(spiralOrder(m2))
- m3 := [][]int{
- {11},
- {16},
- {11},
- }
- fmt.Println(spiralOrder(m3))
- } */
|