美文网首页
LintCode 944. 最大子矩阵

LintCode 944. 最大子矩阵

作者: CW不要无聊的风格 | 来源:发表于2020-08-16 17:45 被阅读0次

    题目描述

    给出一个大小为 n x n 的矩阵,里面元素为 正整数 和 负整数 ,找到具有最大和的子矩阵。


    样例

    输入:

    matrix = [

        [1,3,-1],

        [2,3,-2],

        [-1,-2,-3]

    ]

    输出: 9

    解释:

    具有最大和的子矩阵是:

    [

        [1,3],

        [2,3]

    ]

    输入:

    matrix = [

        [1,1,1],

        [1,1,1],

        [1,1,1]

    ]

    输出: 9

    解释:

    具有最大和的子矩阵是:

    [

        [1,1,1],

        [1,1,1],

        [1,1,1]

    ]


    思路

    与我上一篇 LintCode 41. 最大子数组 中的解法类似,只不过这题求解的是多维数组,因此我们可以先将其“压缩”一维数组

    何谓压缩?其实就是每次取一行,然后依次将下面行对应列位置的数字加上来,每次加一行,然后对所得的一位数组求解最大子数组和,最后再取所有这些和的最大值即为所求。


    代码

    class Solution:

        """

        @param matrix: the given matrix

        @return: the largest possible sum

        """

        def maxSubmatrix(self, matrix):

            max_sum = 0

            for row in range(len(matrix)):

                # 压缩成一位数组

                zip_matrix = [0] * len(matrix[0])

                # 将下面行对应列位置的数加到上面行

                # 从而压缩成一位数组

                for ptr in range(row, len(matrix)):

                    for col in range(len(matrix[0])):

                        zip_matrix[col] += matrix[ptr][col]

                    max_sum = max(max_sum, self.get_max_sub_sum(zip_matrix))

            return max_sum

        def get_max_sub_sum(self, array):

            """求一维数组的最大子数组和"""

            max_local_sum = 0

            max_global_sum = 0

            for num in array:

                max_local_sum = max(max_local_sum + num, num)

                max_global_sum = max(max_global_sum, max_local_sum)

            return max_global_sum

    相关文章

      网友评论

          本文标题:LintCode 944. 最大子矩阵

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