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)) } */