123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package main
- import (
- "fmt"
- )
- 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))
- }
|