螺旋矩阵

题目:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 

实例:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]      




思路:想用一个对应矩阵全至0,然后右下左上这样寻路,走过至为1,结果遇到了越界的情况,尴尬的是我还不会处理这种情况,先留个坑。。

参考一下别人的思路,还是厉害。。。

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        r, i, j, di, dj = [], 0, 0, 0, 1
        if matrix != []:
            for _ in range(len(matrix) * len(matrix[0])):
                r.append(matrix[i][j])
                matrix[i][j] = 0
                if matrix[(i + di) % len(matrix)][(j + dj) % len(matrix[0])] == 0:
                    di, dj = dj, -di
                i += di
                j += dj
        return r

这里说一下我早上碰到一些的坑。。

首先想创建一个矩阵,你如果直接用=的话,是引用地址,所以更改也会更改原矩阵。这个叫浅拷贝

当然深拷贝很棒,无后顾之忧,但是你copy的对象必须是不能改变的,另外这个处理也很慢

还有赋值的问题,二维数组赋值,容易给多个地方的元素赋同一值,对这也是因为他是浅拷贝的原因

写法可以改为

flag=[[0 for i in range(col)] for i in range(row)]

这样就欧凯了

对,这里还学了_在循环里面指的是一个无意义的值,以后用不上,用下划线代替

再来一个,测试类的写法

class Solution:
    def spiralOrder(self, matrix):
        r, i, j, di, dj = [], 0, 0, 0, 1
        if matrix != []:
            for a in range(len(matrix) * len(matrix[0])):
                r.append(matrix[i][j])
                matrix[i][j] = 0
                if matrix[(i + di) % len(matrix)][(j + dj) % len(matrix[0])] == 0:
                    di, dj = dj, -di
                i += di
                j += dj
        return r

if __name__ == "__main__":
    b=Solution()
    p=b.spiralOrder(matrix=[[1,2,3],[4,5,6],[7,8,9]])
    print(p)

记住先实例化,这里跟java思想一致。

原文地址:https://www.cnblogs.com/dmndxld/p/10809489.html