题目:给定一个包含 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思想一致。
标签:__,dj,matrix,di,螺旋,矩阵,len 来源: https://www.cnblogs.com/dmndxld/p/10809489.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。