题目:给定一个包含 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思想一致。