NC304. 最大子矩阵
描述
示例1
输入:
[[0,-2,-7,0],[9,2,-6,2],[-4,1,-4,1],[-1,8,0,-2]]
输出:
15
C++ 解法, 执行用时: 5ms, 内存消耗: 524KB, 提交时间: 2022-08-05
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param matrix int整型vector<vector<>> * @return int整型 */ int getMaxMatrix(vector<vector<int> >& matrix) { // write code here int maxSum = INT_MIN; int M = matrix.size(); int N = matrix[0].size(); for (int i = 0; i < M; i++) { vector<int>tmp(N); for (int j = i; j < M; j++) { int cur=0; for (int k = 0; k < N; k++) { tmp[k]+=matrix[j][k]; cur+=tmp[k]; maxSum=max(maxSum,cur); cur=cur<0?0:cur; } } } return maxSum; } };
C 解法, 执行用时: 5ms, 内存消耗: 524KB, 提交时间: 2022-07-28
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param matrix int整型二维数组 * @param matrixRowLen int matrix数组行数 * @param matrixColLen int* matrix数组列数 * @return int整型 * * C语言声明定义全局变量请加上static,防止重复定义 * * C语言声明定义全局变量请加上static,防止重复定义 */ int getMaxMatrix(int** matrix, int matrixRowLen, int* matrixColLen ) { // write code here int m=matrixRowLen; int n=* matrixColLen; int sum[m+1][n];//第N列的前前M个数的总和 for(int j=0;j<n;j++) { sum[0][j]=0; for(int i=1;i<=m;i++) { sum[i][j]= sum[i-1][j] + matrix[i-1][j]; } } int maxtotal=-100000; for(int i=1;i<=m;i++) { for(int j=m;j>=0;j--) { int total=0; for(int k=0;k<n;k++) { total=total+(sum[j][k]-sum[i-1][k]); maxtotal=maxtotal>total?maxtotal:total; if(total<0) total=0; } if(i==j) break; } } return maxtotal; }
C++ 解法, 执行用时: 5ms, 内存消耗: 524KB, 提交时间: 2022-07-19
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param matrix int整型vector<vector<>> * @return int整型 */ int getMaxMatrix(vector<vector<int> >& matrix) { // write code here int m = matrix.size(); if (m == 0) return 0; if (m == 1) return matrix[0][0]; int n = matrix[0].size(); int res = INT_MIN; for (int i = 0; i < m; i++) { vector<int> sum(n + 1, 0); for (int j = i; j < m; j++) { int pre=0; for (int k = 0; k < n; k++) { sum[k] += matrix[j][k]; pre=max(pre+sum[k],sum[k]); res=max(res,pre); } } } return res; } };
C++ 解法, 执行用时: 5ms, 内存消耗: 524KB, 提交时间: 2022-07-02
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param matrix int整型vector<vector<>> * @return int整型 */ int getMaxSubArr(vector<int>& arr){ int length = (int)arr.size(); if (length == 0) return 0; int curSum = 0, maxSum = INT_MIN; for (int i = 0; i < length; i++) { curSum += arr[i]; maxSum = maxSum >= curSum ? maxSum : curSum; curSum = curSum < 0 ? 0 : curSum; } return maxSum; } int getMaxMatrix(vector<vector<int> >& matrix) { // write code here int rows=(int)matrix.size(); int col=(int)matrix[0].size(); int res=INT_MIN; for(int i=0;i<rows;i++){ for(int j=i+1;j<=rows;j++){ res=max(getMaxSubArr(matrix[i]),res); if(j!=rows) for(int k=0;k<col;k++) matrix[i][k]+=matrix[j][k]; } } return res; } };
C++ 解法, 执行用时: 5ms, 内存消耗: 524KB, 提交时间: 2022-05-08
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param matrix int整型vector<vector<>> * @return int整型 */ int getMaxMatrix(vector<vector<int> >& matrix) { // write code here int n = matrix.size(); int m = matrix[0].size(); vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { dp[i][j] = matrix[i - 1][j - 1] + dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1]; } } int max_value = INT_MIN; for (int top = 0; top < n; top++) { for (int bottom = top; bottom < n; bottom++) { int left = 0; for (int right = 0; right < m; right++) { int sum = (dp[bottom + 1][right + 1] - dp[bottom + 1][left] - dp[top][right + 1] + dp[top][left]); max_value = max(max_value, sum); if (sum < 0) { left = right + 1; } } } } return max_value; } };