问一道G家面试题 - 未名空间(mitbbs.com)
一个matrix,每个matrix[i][j]有一个价格,给你一个budget,问如何求出最大面积的
子矩阵,使得子矩阵的价格之和不超过budget.
Same as max sum rectangle -
One change:get max value that is less than or equal budget.
http://likemyblogger.blogspot.com/2015/08/mj-26-maximum-sum-rectangle-in-2d-matrix.html
这题看起来和leetcode的Maximal Rectangle 很像,但似乎不可能找到类似的复杂度的
解法。
能想到的solution
1.preprocess:建立一个matrix[][]存[0][0]到[i][j]的sum,这个可以
用dp解决,复杂度O(n^2)
2.check 以每一点为右下点的最大可能的矩阵,这个每个点都是O(i*lg(j))的复
杂度了吧。除了可以用个binary search来减少一点复杂度,我也想不到别的办法了。
Read full article from 问一道G家面试题 - 未名空间(mitbbs.com)
一个matrix,每个matrix[i][j]有一个价格,给你一个budget,问如何求出最大面积的
子矩阵,使得子矩阵的价格之和不超过budget.
Same as max sum rectangle -
One change:get max value that is less than or equal budget.
http://likemyblogger.blogspot.com/2015/08/mj-26-maximum-sum-rectangle-in-2d-matrix.html
int kadane(vector<int> &col){
int max_ending_here = INT_MIN, max_ending_sofar = INT_MIN;
for
(auto i:col){
if
(max_ending_here<0) max_ending_here = 0;
max_ending_here += i;
max_ending_sofar = max(max_ending_sofar, max_ending_here);
}
return
max_ending_sofar;
}
int maxSum2D(vector<vector<int>> &matrix){
int m = matrix.size();
if
(m==0)
return
0;
int n = matrix[0].size();
if
(n==0)
return
0;
int ret = INT_MIN;
for
(int l=0; l<n; ++l){
vector<int> col(m, 0);
for
(int r=l; r<n; ++r){
for
(int i=0; i<m; ++i){
col[i] += matrix[i][r];
}
ret = max(ret, kadane(col));
}
}
return
ret;
}
这题看起来和leetcode的Maximal Rectangle 很像,但似乎不可能找到类似的复杂度的
解法。
能想到的solution
1.preprocess:建立一个matrix[][]存[0][0]到[i][j]的sum,这个可以
用dp解决,复杂度O(n^2)
2.check 以每一点为右下点的最大可能的矩阵,这个每个点都是O(i*lg(j))的复
杂度了吧。除了可以用个binary search来减少一点复杂度,我也想不到别的办法了。
Read full article from 问一道G家面试题 - 未名空间(mitbbs.com)