做网站公司长沙,响应式网页制作软件,注册网站引流,内蒙古城乡住房建设厅网站sooooooo long没刷题了#xff0c;汗颜 题目链接#xff1a;leetcode面试题17
1.题目
给定一个正整数、负整数和 0 组成的 N M 矩阵#xff0c;编写代码找出元素总和最大的子矩阵。
返回一个数组 [r1, c1, r2, c2]#xff0c;其中 r1, c1 分别代表子矩阵左上角的行号和…sooooooo long没刷题了汗颜 题目链接leetcode面试题17
1.题目
给定一个正整数、负整数和 0 组成的 N × M 矩阵编写代码找出元素总和最大的子矩阵。
返回一个数组 [r1, c1, r2, c2]其中 r1, c1 分别代表子矩阵左上角的行号和列号r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵返回任意一个均可。
n,m-200
2.分析
1最初想到的版本 首先f[i][j][0]表示第i行前j个格子的前缀和,f[i][j][1]表示第j列前i个格子的前缀和那么以len1,len2,col1,col2为左上角和右下角的矩阵的子矩阵和为f[len2][col2][2]-f[len2][col1-1][2]-f[len1-1][col2][2]f[len1-1][col1-1][2];但这样我们就需要枚举len1,len2,col1,col2,复杂度为NNMM 2在此基础上优化我们可以发现在确定了len1,len2,col1时我们只需要使得f[len2][col2][2]-f[len1-1][col2][2]最大即可那么我们把col1从n-1-0枚举的过程中可以逐步去比较当前最大的f[len2][col2][2]-f[len1-1][col2][2]和当col2col1时的f[len2][col2][2]-f[len1-1][col2][2]谁更大维护一下最大值即可那么复杂度降低为MM*N可以AC
3.代码
class Solution {
public:int f[210][210][5];static bool mycmp(vectorint x,vectorint y){return x[0]y[0];}int get_sum(int len1,int len2,int col1,int col2){return f[len2][col2][2]-f[len1-1][col2][2];}vectorint getMaxMatrix(vectorvectorint matrix) {memset(f,0,sizeof(f));int mmatrix.size(),nmatrix[0].size();for(int i0;im;i)for(int j0;jn;j){int leni1,colj1,cmatrix[i][j];f[len][col][0]f[len-1][col][0]c;f[len][col][1]f[len][col-1][1]c;f[len][col][2]f[len-1][col-1][2]f[len][col-1][1]f[len-1][col][0]c;}int ansmatrix[0][0],r10,r20,c10,c20;for(int i0;im;i)for(int ki;km;k){int len1i1,len2k1,col2n;int col_sumf[len2][col2][2]-f[len1-1][col2][2];for(int jn-1;j0;j--){int col1j1;if(get_sum(len1,len2,col1,j1)col_sum){col_sumget_sum(len1,len2,col1,j1);col2j1;}int ans_testf[len2][col2][2]-f[len2][col1-1][2]-f[len1-1][col2][2]f[len1-1][col1-1][2];if(ans_testans){ansans_test;r1i,c1j,r2k,c2col2-1;}}}vectorint ans_vec;ans_vec.push_back(r1);ans_vec.push_back(c1);ans_vec.push_back(r2);ans_vec.push_back(c2);return ans_vec;}};