原题地址:https://leetcode-cn.com/problems/max-sum-of-rectangle-no-larger-than-k/submissions/
题目描述:
给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和。
示例:
输入: matrix = [[1,0,1],[0,-2,3]], k = 2
输出: 2
解释: 矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。
说明:
矩阵内的矩形区域面积必须大于 0。
如果行数远大于列数,你将如何解答呢?
解题方案:
使用动态规划的方法,采用最暴力的方式遍历所有可能的矩阵和,寻找最大值:
class Solution {
public:
int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
if(matrix.empty() || matrix[0].empty())
return 0;
int m = matrix.size(), n = matrix[0].size();
int sum[m][n];
int res = INT_MIN;
for(int i = 0; i < m; i ++){
for(int j = 0; j < n; j ++){
int t = matrix[i][j];
if(i > 0)
t += sum[i - 1][j];
if(j > 0)
t += sum[i][j - 1];
if(i > 0 && j > 0)
t -= sum[i - 1][j - 1];
sum[i][j] = t;
for(int r = 0; r <= i; r ++){
for(int c = 0; c <= j; c ++){
int d = sum[i][j];
if(r > 0)
d -= sum[r - 1][j];
if(c > 0)
d -= sum[i][c - 1];
if(r > 0 && c > 0)
d += sum[r - 1][c - 1];
if(d <= k)
res = max(res, d);
}
}
}
}
return res;
}
};
时间最短的方法:
public:
int maxSumSubmatrix(vector<vector<int>>& matrix, int k) {
if(matrix.size()==0) return 0;
int row = matrix.size(), col = matrix[0].size();
int ans =INT_MIN;
for(int i = 0; i < col; i++)
{
vector<int> sum(row, 0);
for(int j =i; j < col; j++)
{
set<int> st{0};
int curSum =0, curMax = INT_MIN;
for(int x = 0; x < row; x++)
{
sum[x] += matrix[x][j];
curSum += sum[x];
auto it = st.lower_bound(curSum-k);
if(it!=st.end()) curMax = max(curSum - *it, curMax);
st.insert(curSum);
}
ans = max(curMax, ans);
}
}
return ans;
}
};