给定一个NxN矩阵mat和矩阵的阶数n,已知矩阵由正整数和负整数组成,请返回元素总和最大的子矩阵的元素之和。要求元素绝对值小于等于100000,尽量高效且矩阵阶数小于等于200。
测试样例:
[[1,2,-3],[3,4,-5],[-5,-6,-7]],3
返回:10
# -*- coding:utf-8 -*- def find_max(arr): if arr is None or len(arr) == 0: return 0 max_sum = cur_sum = float('-inf') for num in arr: if cur_sum <= 0: cur_sum = num else: cur_sum += num if cur_sum > max_sum: max_sum = cur_sum return max_sum """ 对每一行,与下面行累加,得到一个一维数组,用一维数组求连续子数组的最大和的方式求出最大和。O(N^2) """ def find_max_matrix(matrix, n): if n <= 0: return 0 max_sum = float('-inf') row = len(matrix) # 行数 for i in range(row): sum_arr = matrix[i] cur_sum = find_max(sum_arr) if cur_sum > max_sum: max_sum = cur_sum for j in range(i+1, row): sum_arr = [sum_arr[x]+matrix[j][x] for x in range(len(sum_arr))] cur_sum = find_max(sum_arr) if cur_sum > max_sum: max_sum = cur_sum return max_sum class SubMatrix: def sumOfSubMatrix(self, mat, n): return find_max_matrix(mat, n)