54.go 1.3 KB

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