题解 | #最大子矩阵#

最大子矩阵

http://www.nowcoder.com/practice/a5a0b05f0505406ca837a3a76a5419b3

本题目类似于柱状图中最大矩形,不过那一题使用单调栈做的(只有0和1),本题的话也可以用类似的思路,遍历矩形的行的起点和终点组合,然后相当于就是求解最大连续子数组和,最后取全局最大。
import java.util.*;
public class Main{
    public static void main(String []args){
        Scanner input=new Scanner(System.in);
        int n=input.nextInt();
        int [][]num=new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                num[i][j]=input.nextInt();
            }
        }
       
        int max=Integer.MIN_VALUE;
        for(int i=0;i<n;i++){
             int []tmp=new int[n];
            for(int k=i;k<n;k++){
                for(int j=0;j<n;j++){
                    tmp[j]+=num[k][j];
                }
                max=Math.max(max,new Main().getMax(tmp));
            }
            
        }
        System.out.println(max);
        
  
    }
    public int getMax(int[]arr){
        int n=arr.length;
        if(n==0){
            return arr[0];
        }
        int max=arr[0];
        int []dp=new int[n];
        dp[0]=arr[0];
        for(int i=1;i<n;i++){
            dp[i]=Math.max(dp[i-1]+arr[i],arr[i]);
            max=Math.max(max,dp[i]);
        }
        return max;

    }
}


全部评论
我有一个问题 二维数组变成一维以后,求解出来的一定是 二维里面连续的矩阵吗? 是不是得筛选一下 没懂 这个空间复杂度也是n4吧
点赞 回复 分享
发布于 2022-11-13 18:42 湖北
这个求一维数组的方法 步长不应该是一个一个的增加 二是应该按照二维数组转换成的方式 每次加二个数或三个数多个数的和 这样才是保证连续的啊?
点赞 回复 分享
发布于 2022-11-13 18:49 湖北
这题想看懂,还得先看剑指offer第39题。
点赞 回复 分享
发布于 2023-05-09 00:41 江苏

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务