LeetCode面试题 17.24. 最大子矩阵

LeetCode面试题 17.24. 最大子矩阵

题目

给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。

返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。

输入:
[
[-1,0],
[0,-1]
]
输出:[0,1,0,1]
解释:输入中标粗的元素即为输出所表示的矩阵

  • 1 <= matrix.length, matrix[0].length <= 200

解法

这个题可以看作是LeetCode53题的升维版,从一维数组升级到二维数组。
假设这个二维数组为A,其为m*n的。
有一个一维数组B,为1 * n的
B[j]可以看作是A[p][j]到A[q][j]的和(B是A其中某几行的行求和的数组)
对B进行一维的最大子序列求解,就可以得到目标

class Solution {
    public int[] getMaxMatrix(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        int[] res = new int[4];
        int max = Integer.MIN_VALUE;
		
		//对matrix按行求前缀和
        for(int i = 0 ; i < m ; ++i){
            for(int j = 0 ; j < n ; ++j){
                if(i>0){
                    //matrix[i][j]表示第j列的0-i个元素的和
                    matrix[i][j]+= matrix[i-1][j];
                }
            }
        }

        for(int i = 0 ; i < m ; ++i){
            int[] cur = new int[n];
            for(int j = i; j < m ; ++j){
                for(int k = 0 ; k < n ; ++k){//求某几行的和数组
                    if(i>0){
                        cur[k] = matrix[j][k]-matrix[i-1][k];
                    }else{
                        cur[k] = matrix[j][k];
                    }
                }
                if(max<cur[0]){
                    res[0] = i;
                    res[1] = 0;
                    res[2] = j;
                    res[3] = 0;
                    max = cur[0];
                }
                int begin = 0;
                for(int k = 1 ; k < n ; ++k){
                    if(cur[k-1]>0){
                        cur[k] += cur[k-1];
                    }else{
                        begin = k;
                    }
                    if(max<cur[k]){
                        res[0] = i;
                        res[1] = begin;
                        res[2] = j;
                        res[3] = k;
                        max = cur[k];
                    }
                }
            }

        }
        return res;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值