题解 | #螺旋矩阵#

螺旋矩阵

http://www.nowcoder.com/practice/7edf70f2d29c4b599693dc3aaeea1d31

仅提供一种解题思路,由于python对于数组或列表的一些操作更加简便因此不确定其他语言是否容易实现这种解题思路。同时本题做法或许还可以优化。

通过问题分析,可以知道对于任意矩阵来说螺旋取值就是对矩阵由外到内一圈一圈顺时针取值,每一圈取值的过程总共分为四个步骤:1、取矩阵第一行;2、取矩阵最后一列;3、取矩阵最后一行;4、取矩阵第一列。但是如果直接取值就会出现矩阵的角落值重复,所以本题采用的方法是通过取值后在原矩阵基础上删除行或列,构造出未取值的矩阵供后续螺旋取值。换句话说,矩阵取完一圈值后把这一圈删除形成一个新的矩阵,剥洋葱一样层层递进,到最后矩阵就会是一个空矩阵,就得到了想要的结果。

PS:把通过循环将矩阵一圈一圈由外到内进行数据剥离,由于行数据和列数据取值和删除方式不同,所以需要采用不同方法。同时对于数据还存反转操作,应该也还有优化空间。

演示过程:
原矩阵:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
步骤1:
取矩阵第一行[1, 2, 3],并在原矩阵上删除得到新矩阵
[4, 5, 6]
[7, 8, 9]
步骤2:
取矩阵最后一列[6, 9],并删除,得到新矩阵
[4, 5]
[7, 8]
步骤3:
矩阵最后一行反转取值[8, 7],并删除,得到新矩阵
[4, 5]
步骤4:
矩阵第一列反转取值[4],并删除,得到新矩阵
[5]
至此,矩阵第一圈螺旋取值完成,接下来就是继续一圈一圈取值,知道判断出矩阵为空即可得到结果。

class Solution:
    def spiralOrder(self , matrix ):
        # write code here
        list = []    # 用于存储螺旋矩阵数值
        while(not(len(matrix) ==0 or len(matrix[0]) == 0)):
            # 取matrix的第一行
            list.extend(matrix[0])
            # 删除matrix的第一行
            del matrix[0]
            # 取值后还需判断矩阵是否空
            if (len(matrix) ==0 or len(matrix[0]) == 0):    break
            # 由于列数据无法一次性取出,故采用循环取值,同时通过pop()方法删除
            for i in range(len(matrix)):
                list.append(matrix[i].pop(-1))
            if (len(matrix) ==0 or len(matrix[0]) == 0):    break
            # 取matrix的最后一行,但由于顺序问题需要数据进行反转
            list.extend(matrix[-1][::-1])
            # 删除matrix的最后一行
            del matrix[-1]
            if (len(matrix) ==0 or len(matrix[0]) == 0):    break
            # 循环取值matrix的第一列,并通过pop()方法删除
            for i in range(len(matrix)):
                list.append(matrix[-(i+1)].pop(0))
        return list
全部评论

相关推荐

lllllkin:感觉可以精简到一页简历,有些排版感觉不是必须的。 时间线越早的,你自己越熟悉的放前面。描述可以更精简些,一些问题解决感觉可以不用写具体技术栈,卖个关子,等面试官问。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务