列表

详情


NC304. 最大子矩阵

描述

已知矩阵的大小定义为矩阵中所有元素的和。
给定一个大小为N*N的矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。 比如,如下4 * 4的矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2 的最大子矩阵是
9 2
-4 1
-1 8 这个子矩阵的大小是15。

数据范围:

示例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;
    }
};

上一题