54.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. func spiralOrder(matrix [][]int) (res []int) {
  6. if len(matrix) == 0 {
  7. return
  8. }
  9. w, h := len(matrix[0]), len(matrix)
  10. for x, y := 0, 0; w > 0 && h > 0; w, h, x, y = w-2, h-2, x+1, y+1 {
  11. if h == 1 {
  12. // 1 2 3 4
  13. res = append(res, matrix[y][x:x+w]...)
  14. return
  15. } else if w == 1 {
  16. // 1
  17. // 2
  18. // 3
  19. // 4
  20. for i := 0; i < h; i, y = i+1, y+1 {
  21. res = append(res, matrix[y][x])
  22. }
  23. return
  24. }
  25. // 1 2 3 4 loop1 -> 1 2 3
  26. // 12 ... 5 loop2 -> 4 5 6
  27. // 11 ... 6 loop3 -> 7 8 9
  28. // 10 9 8 7 loop4 -> 10 11 12
  29. var xSpeed, ySpeed, length int
  30. for loop := 0; loop < 4; loop++ {
  31. switch loop {
  32. case 0:
  33. xSpeed, ySpeed, length = 1, 0, w-1
  34. case 1:
  35. xSpeed, ySpeed, length = 0, 1, h-1
  36. case 2:
  37. xSpeed, ySpeed, length = -1, 0, w-1
  38. default:
  39. xSpeed, ySpeed, length = 0, -1, h-1
  40. }
  41. for i := 0; i < length; i++ {
  42. res = append(res, matrix[y][x])
  43. x += xSpeed
  44. y += ySpeed
  45. }
  46. }
  47. }
  48. return
  49. }
  50. func main() {
  51. m1 := [][]int{
  52. {11, 22, 33, 44, 55},
  53. {16, 27, 38, 49, 50},
  54. {11, 23, 35, 47, 59},
  55. {12, 24, 36, 48, 50},
  56. {15, 24, 33, 42, 51},
  57. }
  58. fmt.Println(spiralOrder(m1))
  59. m2 := [][]int{
  60. {11, 22, 11},
  61. {16, 27, 33},
  62. {11, 23, 24},
  63. {12, 13, 44},
  64. }
  65. fmt.Println(spiralOrder(m2))
  66. m3 := [][]int{
  67. {11},
  68. {16},
  69. {11},
  70. }
  71. fmt.Println(spiralOrder(m3))
  72. }