54. Spiral Matrix 【M】【82】

175 篇文章 0 订阅
157 篇文章 0 订阅


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]
        """
        


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值