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