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