LC吐血整理之Matrix篇
2019-09-25 本文已影响0人
amilyxy
63.旋转图像
其实官方题解中转置加翻转是比较简洁的方法
下图是题解方法二的图解(仅供参考:
Tips1: List.reverse()
>>> matrix[i]= [1, 2, 3]
>>> matrix[i].reverse()
[3, 2, 1]
54.螺旋矩阵I&II
我也不知道我写的复杂不复杂,代码有点多,详情看github代码
逻辑理顺了还是比较好做的,今天无 Tips,今天上来补Tips了,看答案 发现一个规律:
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
res = []
while matrix:
res += matrix.pop(0)
matrix = list(map(list, zip(*matrix)))[::-1]
return res
2020.2.11我又来了,做剑指offer,看到一个挺好的想法,标记数组法,观察顺时针打印矩阵规律,打印顺序 向右->向下->向左->向上
,当走一个方向到边界或者已经走过了就改变方向。
这种方式只需要改变走的方向就可以修改为逆时针打印数组,不足就是需要一个marked数组(如果定义了矩阵元素全为数字,那就可以在原数组上修改了~看情况吧),代码在github嗷。
有机会可以把螺旋矩阵III做一下,也可以用这个方法,真的好使。
73.矩阵置零
O(m+n)比较容易想到,看了O(1)的作法,不得不说,妙啊~
注意: Github上O(1)解法,倒序遍历的巧妙之处在于一次循环就可以完成置零,之后不用额外对第一行第一列进行遍历。
# 给定一个 *m* x *n* 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
class Solution(object):
def setZeroes(self, matrix):
is_col = False
R = len(matrix)
C = len(matrix[0])
for i in range(R):
if matrix[i][0] == 0: is_col = True
for j in range(1, C):
if matrix[i][j] == 0:
matrix[0][j] = 0
matrix[i][0] = 0
for i in range(R-1,-1,-1):
for j in range(C-1,0,-1):
if not matrix[i][0] or not matrix[0][j]:
matrix[i][j] = 0
if is_col: matrix[i][0] = 0
329.矩阵中的最长递增路径
今日份的Tips-1:
在做这个题的时候,我用maxlen
数组保存matrix
上每个位置的最长递增路径,然后求max(maxlen)
,奇怪的事情发生了:
>>> maxlen = [[0, 0, 1], [2, 1, 0], [0, 2, 3]]
>>> max(maxlen)
[2, 1, 0]
>>> maxlen = [[9,9,4],[6,10,8],[2,1,1],[9,2,4]]
>>> max(maxlen)
[9, 9, 4]
>>> max(max(maxlen))
9 # 目标是得到最大值10
max(二维list) 难道不是对每一列/每一行求最大值..?? 迷惑行为,实际是返回第一列最大值所在行,有多个最大值时比较下一列,返回下一列最大值所在行。
正确写法:
>>> maxlen = [[9,9,4],[6,10,8],[2,1,1],[9,2,4]]
>>> max(max(row) for row in maxlen )
10
>>> max(map(max, maxlen))
10
Ps:我记得以前有过max(max())这种写法啊...不知道是numpy还是tensorflow...,不管怎样,二维list求最大值不能这么求...