美文网首页
LC吐血整理之Matrix篇

LC吐血整理之Matrix篇

作者: amilyxy | 来源:发表于2019-09-25 10:08 被阅读0次

    \color{red}{所有题解方法请移步}github-Leecode_summary

    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求最大值不能这么求...

    相关文章

      网友评论

          本文标题:LC吐血整理之Matrix篇

          本文链接:https://www.haomeiwen.com/subject/dsbmuctx.html