1278. 不超过K的最大矩形元素之和
给定一个非空的二维矩阵 matrix 和一个整数 k,找出 matrix 中的一个矩形,该矩形内的元素之和最大并且不超过 k,返回这个最大和。
样例
给定 matrix = [
[1, 0, 1],
[0, -2, 3]
]
k = 2
答案为2
。因为矩形[[0, 1], [-2, 3]]
的元素之和为2
,并且2
是不超过k (k = 2)
的最大数字。
AC源代码:
class Solution {
public:
/**
* @param matrix: a 2D matrix
* @param k: an integer
* @return: the max sum of a rectangle in the matrix such that its sum is no larger than k
*/
int fun(vector<vector<int>> &matrix,vector<vector<int>> &recode, int begin,int end,int allsum,int k){//遍历固定列之间的所有行数的组合
int len=matrix.size();
for(int i=0;i<len;i++){
int sum=0;
for(int j=i;j<len;j++){
if(i==0){
sum+=linesum(matrix,recode,j,begin,end);//j行的和
}
else {
sum+=recode[end][j];//第一次遍历过之后,已存储在辅助数组中,不需要再遍历,减小时间复杂度
}
if(sum==k){
return k;
}
else if(sum>allsum&&sum<k){
allsum=sum;
}
}
if(allsum==k){return k;}
}
return allsum;
}
int linesum(vector<vector<int>> &matrix,vector<vector<int>> &recode, int numline,int begin,int end){//特定行、指定列宽的和
if(begin==end){
recode[end][numline]=matrix[numline][end];
}
else if(end>0){
recode[end][numline]=recode[end-1][numline]+matrix[numline][end];
}
return recode[end][numline];
}
int maxSumSubmatrix(vector<vector<int>> &matrix, int k) {
// Write your code here
int len=matrix.size();//行数
int wid=matrix[0].size();//列数
int allsum=-1000;
for(int i=0;i<wid;i++){
vector<vector<int>> recode(wid);//辅助数组,用于内层存储遍历结果
for(int p=0;p<wid;p++){
recode[p].resize(len);
recode[p]={0};
}
int sum=0;
for(int j=i;j<wid;j++){ //遍历所有列的组合
allsum=fun(matrix,recode,i,j,allsum,k);
if(allsum==k){return k;}
}
if(allsum==k)return k;
}
return allsum;
}
};