已知矩阵的大小定义为矩阵中所有元素的和。
给定一个大小为N*N的矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。 比如,如下4 * 4的矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2 的最大子矩阵是
9 2
-4 1
-1 8 这个子矩阵的大小是15。
数据范围:
[[0,-2,-7,0],[9,2,-6,2],[-4,1,-4,1],[-1,8,0,-2]]
15
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param matrix int整型ArrayList<ArrayList<>> * @return int整型 */ public int getMaxMatrix (ArrayList<ArrayList<Integer>> matrix) { // write code here int lenline = matrix.get(0).size(); int len = matrix.size(); int[][] arr = new int[lenline][len]; int result = Integer.MIN_VALUE; //转换为二维数组 for(int i = 0;i<lenline;i++){ for(int j = 0;j<len;j++) arr[i][j] = matrix.get(i).get(j); } return getMaxNum(arr); } private int getMaxNum(int[][] a) { int res = 0; if (a == null || a.length == 0 || a[0].length == 0) { return res; } int[] temp = null; res = Integer.MIN_VALUE; int max = 0; for (int i = 0; i < a.length; i++) { temp = new int[a[0].length]; for (int j = i; j < a.length; j++) { max = 0; for (int k = 0; k < a[0].length; k++) { int te = temp[k]; //k列当前 从i到j行的值 temp[k] += a[j][k]; //比较0-k列与单k列值 max = Math.max(max + temp[k], temp[k]); res = Math.max(res,max); } } } return res; }
import java.util.*; public class Solution { public int getMaxMatrix (ArrayList<ArrayList<Integer>> matrix) { int lenline = matrix.get(0).size(); int len = matrix.size(); int[][] arr = new int[lenline][len]; for(int i = 0;i<lenline;i++){ for(int j = 0;j<len;j++) arr[i][j] = matrix.get(i).get(j); } for(int i = 1;i<arr.length;i++){ for(int j = 0;j<arr[0].length;j++){ arr[i][j] += arr[i-1][j]; } } int ressum = Integer.MIN_VALUE; for(int i = 0;i<arr.length;i++){ for(int j = i;j<arr.length;j++){ int[] res = new int[arr[0].length]; for(int k = 0;k<arr[0].length;k++){ if(i==0) res[k] = arr[j][k]; else res[k] = arr[j][k] - arr[i-1][k]; } int tempsum = maxSubsequence(res); ressum = Math.max(tempsum,ressum); } } return ressum; } public int maxSubsequence(int[] array){ int res = array[0]; int[] dp = new int[array.length]; dp[0] = array[0]; for(int i = 1;i<dp.length;i++){ dp[i] = Math.max(dp[i-1]+array[i],array[i]); res = Math.max(res,dp[i]); } return res; } }