Given a matrix, return a list that represents the spiraling out of the matrix starting from the center of the matrix.
The Idea: Reverse a list of size n*m. Starting from the center of the matrix is equivalent to starting on the top right, and spiraling inwards. Append the elements backwards in a reserved list.
Complexity: O(n*m) time and O(1) space, although we are modifying the contents of the matrix.
import sysdefmid_spiral_traversal(matrix): move = [(0,1), (1,0), (0,-1), (-1,0)] spiral = [0] *len(matrix)*len(matrix[0]) bk_iter =len(spiral)-1 rotation =0 r =0 c =0 stop_r =2*min(len(matrix), len(matrix[0]))+1 cur_mov = move[rotation %len(move)]while rotation < stop_r:# each rotation is a new directionwhile0<= r <len(matrix)and0<= c <len(matrix[0])\and matrix[r][c] != sys.maxsize: spiral[bk_iter]= matrix[r][c] matrix[r][c] = sys.maxsize r += cur_mov[0] c += cur_mov[1] bk_iter -=1# we overcounted by 1 r -= cur_mov[0] c -= cur_mov[1]# begin the next direction rotation +=1 cur_mov = move[rotation %len(move)] r += cur_mov[0] c += cur_mov[1]return spiralt1 = [[1,2,3 ], [4,5,6], [7,8,9]]t2 = [[ 1,2,3,4,5,6 ], [ 14,15,16,17,18,7 ], [ 13,12,11,10,9,8 ]]t3 = [[3], [2]]print(mid_spiral_traversal(t1))print(mid_spiral_traversal(t2))print(mid_spiral_traversal(t3))