描述
给定一个NxM的矩阵A和一个整数K,小Hi希望你能求出其中最大(元素数目最多)的子矩阵,并且该子矩阵中所有元素的和不超过K。
解题思路
子矩阵的高度和宽度都是不确定的,我们只能确定下来高度(假设讨论高度=1的情况),然后再求最大宽度。
高度为2的情况,高度为3的情况等等随后再讨论。
最大宽度
宽度的左边界可以以1为起点,可以以2为起点,可以以3为起点.用for循环实现。宽度的右边界同理。
package com.company;
public class Test5 {
public static void main(String[] args) {
int[][] A={
{1,2,3},
{4,5,6},
{7,8,9}
};
int k=20;
int max=0;
for (int i = 0; i < A.length; i++) {
for (int j = i; j < A.length; j++) {
System.out.println(i+","+j);
int num=square(A,i,j,k);
max=num>max?num:max;
}
}
System.out.println(max);
}
public static int square(int[][] A,int begin,int end,int k){
int width=A[0].length;
int j=-1;
int max=0;
for (int i = 0; i < width; i++) {
if(j==-1||j==width)
j=i+1;
while (j<width){
if(sum(A,begin,end,i,j)>k){
int num=(j-i)*(end-begin+1);
max=num>max?num:max;
break;
}
j++;
}
int num=(j-i)*(end-begin+1);
max=num>max?num:max;
}
return max;
}
private static int sum(int[][] A, int begin, int end, int i, int j) {
int sumValue=0;
for (int k = begin; k <= end; k++) {
for (int l = i; l <= j; l++) {
sumValue+=A[k][l];
}
}
return sumValue;
}
}