Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
Subscribe to see which companies asked this question
其实本质上就是个状态机,按照四个方向转换状态,然后进行处理
class Solution(object):
def spiralOrder(self, matrix):
m = matrix
if not m:
return []
row = len(m)
col = len(m[0])
res = []
if row == 1:
return m[0]
if col == 1:
for i in m:
res += i[0],
return res
d = 'r'
v = []
count = 0
for i in xrange(len(m)):
v += [0] * len(m[0]),
count += len(m[0])
for j in xrange(len(m[0])):
v[i][j] = 0
res = []
i,j = 0,0
while count > 0:
#print res
if d =='r':
k = j
while k < col:
if v[i][k] == 1:
j = k - 1
break
res += m[i][k],
v[i][k] = 1
count -= 1
k += 1
if j != k-1:
j = col - 1
i += 1
d = 'd'
#print res,v,d,count
elif d == 'd':
k = i
while k < row:
if v[k][j] == 1:
i = k - 1
break
res += m[k][j],
v[k][j] = 1
count -= 1
k += 1
# print res,k,d
if i != k-1:
i = row - 1
j -= 1
d = 'l'
elif d == 'l':
#print 'd callled'
k = j
while k >= 0:
if v[i][k] == 1:
# print res
j = k + 1
break
res += m[i][k],
v[i][k] = 1
count -= 1
k -= 1
if j != k+1:
j = 0
i -= 1
d = 'u'
elif d == 'u':
k = i
while k >= 0:
if v[k][j] == 1:
i = k + 1
break
res += m[k][j],
v[k][j] = 1
count -= 1
k -= 1
if i != k+1:
i = 1
j += 1
d = 'r'
return res
"""
:type matrix: List[List[int]]
:rtype: List[int]
"""