问题描述
有一个正整数和负整数组成的NxN矩阵,请编写代码找出元素总和最大的子矩阵。请尝试使用一个高效算法。
给定一个int矩阵mat和矩阵的阶数n,请返回元素总和最大的子矩阵的元素之和。保证元素绝对值小于等于100000,且矩阵阶数小于等于200。
测试样例:
[[1,2,-3],[3,4,-5],[-5,-6,-7]],3
返回:10
将二维数据拆分为一维数据连续子数组和,算法复杂度 O(N^3)
public static int maxSum(int[][] array){
if(null == array || array.length == 0){
return 0;
}
int[][] colSum = new int[array.length][array[0].length];
for(int i = 0; i < array.length; i++){
for(int j = 0; j < array[0].length; j++){
colSum[i][j] = i == 0 ? array[i][j] : (array[i][j] + colSum[i - 1][j]);
}
}
int maxSum = array[0][0];
int[] tmpColSum = new int[array[0].length];
for(int i = 0; i < array.length; i++){
for(int j = i; j < array.length; j++){
if(i == 0){
maxSum = Math.max(maxSum, maxSum(colSum[j]));
}else{
//重置tmp数组 j 行减去 i - 1行
for(int t = 0; t < array[0].length; t++){
tmpColSum[t] = colSum[j][t] - colSum[i - 1][t];
}
maxSum = Math.max(maxSum, maxSum(tmpColSum));
}
}
}
return maxSum;
}
//一位数组求最大连续子数组和
public static int maxSum(int[] array){
if(null == array || array.length == 0){
return 0;
}
int tmp = array[0];
int max = array[0];
for(int i = 1; i < array.length; i++){
if(tmp < 0){
tmp = 0;
}
tmp += array[i];
max = Math.max(max, tmp);
}
return max;
}