题解 | #最大子矩阵#
最大子矩阵
https://www.nowcoder.com/practice/1d889593a08645319d8d2fc8f804630e
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix int整型ArrayList<ArrayList<>>
* @return int整型
*/
public int getMaxMatrix (ArrayList<ArrayList<Integer>> matrix) {
/*
dp
题解:
首先,最大子矩阵和最小子矩阵是同一回事。
我们先求出矩阵每一列的前缀和sum[i][j],i为列号,j为行号,然后枚举一个开始的行和一个结束的行,
然后问题就转化成了最大子数组问题,最大子数组的前缀和就是sum[j][ed]-sum[j][st-1]
最大子数组的解法就是遍历一遍数组,如果当前数字和为正数,就更新答案,如果为负数,则从下一个位置开始重新求和。
*/
int n = matrix.size();
int m = matrix.get(0).size();
int ans = matrix.get(0).get(0);
for (int i = 0; i < n ; i++) {
for (int j = 0; j < m ; j++) {
ans = Math.min(ans, matrix.get(i).get(j));
}
}
int mostmin = ans;
for (int i = 0; i < n ; i++) {
int[] help = new int[m];
for (int row = i; row < n ; row++) {
for (int col = 0; col < m ; col++) {
help[col] += matrix.get(row).get(col);
}
int cursum = f(help, mostmin);
ans = Math.max(ans, cursum);
}
}
return ans;
}
public int f(int[] arr, int max) {
//max =Integer.MIN_VALUE;
int tmp = 0;
for (int i = 0; i < arr.length ; i++) {
if (tmp > 0) tmp += arr[i];
else
tmp = arr[i];
max = Math.max(max, tmp);
}
return max;
}
}

美的集团公司福利 859人发布