Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix such that its sum is no larger than k.
Example:
Input: matrix = [[1,0,1],[0,-2,3]], k = 2
Output: 2
Explanation: Because the sum of rectangle [[0, 1], [-2, 3]]
is 2,
and 2 is the max number no larger than k (k = 2).
Note:
- The rectangle inside the matrix must have an area > 0.
- What if the number of rows is much larger than the number of columns?
题目 求matrix 中任意矩形和不大于k的最大值。
暴力破解,先遍历一遍,缓存matrix[0][0]到matrix[i][j]形成的矩形的和。然后遍历所有可能返回最大值。代码如下:
int maxSumSubmatrix(int** matrix, int matrixSize, int* matrixColSize, int k){
//初始化matrix,使得每个单元的值等于当前位置与(0,0)为对角线的矩形的总值,方便后续计算每个矩形的值
int ret = -1000000000;
for(int i = 0 ;i < matrixSize;++i){
for(int j = 0; j < matrixColSize[0];++j){
int t = matrix[i][j];
if(i > 0){
t += matrix[i-1][j];
}
if(j > 0){
t += matrix[i][j-1];
if(i > 0){
t-= matrix[i-1][j-1];
}
}
matrix[i][j] = t;
}
}
for(int si = 0 ; si < matrixSize;++si ){
for(int sj = 0;sj < matrixColSize[0];++sj ){
for(int ei = si;ei < matrixSize;++ei){
for(int ej = sj;ej < matrixColSize[0];++ej){
int v = matrix[ei][ej];
if(si > 0){
v -= matrix[si-1][ej];
}
if(sj > 0){
v -= matrix[ei][sj-1];
if(si > 0){
v += matrix[si-1][sj-1];
}
}
if(v <= k && v > ret){
ret = v;
}
if(ret == k){
return k;
}
// printf("%d %d %d %d %d\n",si,sj,ei,ej,v);
}
}
}
}
return ret <= k ? ret : k;
}