面试题 17.24. 最大子矩阵

简介: 面试题 17.24. 最大子矩阵

前言

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

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

注意:本题相对书上原题稍作改动

示例:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/max-submatrix-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一、大流程

矩形必须包含第0行数据,且只包含第0行的情况下,最大累加和是多少?
矩形必须包含0,1两行数据,且只包含0,1两行的情况下,最大累加和是多少?
矩形必须包含0,1,2三行数据,且只包含0,1,2三行的情况下,最大累加和是多少?
矩形必须包含0,1,2,3四行数据,且只包含0,1,2,3四行的情况下,最大累加和是多少?
然后1行~1行
1行~2行
1行~3行
1行~4行
然后2行~2行
2行~3行
2行~4行
然后3行~3行
然后4行~4行
如果我们能够每一个都求出来,答案一定在其中。

二、压缩数组技巧

矩形必须包含0,1两行数据,且只包含0,1两行的情况下,最大累加和是多少?
两行上下数据压在一起,形成一个新数组对这个数组求最大累加和就代表必须包含0,1两行数据,且只包含01两行数据画框的最好答案是啥。

    public static int maxSum(int[][] m) {
        if (m == null || m.length == 0 || m[0].length == 0) {
            return 0;
        }
        // O(N^2 * M)
        int N = m.length;
        int M = m[0].length;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < N; i++) {
            // i~j
            int[] s = new int[M];
            for (int j = i; j < N; j++) {
                for (int k = 0; k < M; k++) {
                    s[k] += m[j][k];
                }
                max = Math.max(max, maxSubArray(s));
            }
        }
        return max;
    }
    
    public static int maxSubArray(int[] arr) {
        if (arr == null || arr.length == 0) {
            return 0;
        }
        int max = Integer.MIN_VALUE;
        int cur = 0;
        for (int i = 0; i < arr.length; i++) {
            cur += arr[i];
            max = Math.max(max, cur);
            cur = cur < 0 ? 0 : cur;
        }
        return max;
    }

求坐标

回到原问题,我们只需在max更新时记录坐标即可

class Solution {
    public int[] getMaxMatrix(int[][] matrix) {
        int n=matrix.length;
        int m=matrix[0].length;
        int max=Integer.MIN_VALUE;
        int cur=0;
        int a=0;
        int b=0;
        int c=0;
        int d=0;
        //0-0,0-1...1-1,1-2...m-m
        for(int i=0;i<n;i++){
            int[] s=new int[m];
            for(int j=i;j<n;j++){
                cur=0;
                int begin=0;
                for(int k=0;k<m;k++){
                    s[k]+=matrix[j][k];
                    cur+=s[k];
                    if(max<cur){
                        max=cur;
                        a=i;
                        b=begin;
                        c=j;
                        d=k;
                    }
                    if(cur<0){
                        cur=0;
                        begin=k+1;
                    }
                }
            }
        }
        return new int[]{a,b,c,d};
    }
}
相关文章
|
运维 负载均衡 算法
MySQL MGR模式介绍
MGR是Mysql Group Replication(组复制)的缩写,Mysql5.7之后是以一个Mysql插件的形式集成在Mysql中,用于创建可伸缩、高可用、可容错的复制架构,是Mysql集群的一种形式
2459 0
MySQL MGR模式介绍
|
关系型数据库 MySQL 索引
【MySQL】当前读、快照读、MVCC
【MySQL】当前读、快照读、MVCC当前读:  select...lock in share mode (共享读锁)  select...for update  update , delete , insert   当前读, 读取的是最新版本, 并且对读取的记录加锁, 阻塞其他事务同时改动相同记录,避免出现安全问题。
12810 0
|
6月前
|
存储 自然语言处理 前端开发
2025年大模型发展脉络:深入分析与技术细节
本文深入剖析2025年大模型发展脉络,涵盖裸模型与手工指令工程、向量检索、文本处理与知识图谱构建、自动化提示生成、ReAct多步推理及AI Agent崛起六大模块。从技术细节到未来趋势,结合最新进展探讨核心算法、工具栈与挑战,强调模块化、自动化、多模态等关键方向,同时指出计算资源、数据质量和安全伦理等问题。适合关注大模型前沿动态的技术从业者与研究者。
1975 9
|
11月前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现智能食品广告投放优化的深度学习模型
使用Python实现智能食品广告投放优化的深度学习模型
297 0
|
物联网
什么是动态发射功率控制 (DTPC)?
【8月更文挑战第24天】
1445 0
|
安全 API 数据库
Python中的Tortoise ORM框架:高效、灵活的数据库交互新选择
【4月更文挑战第14天】在Python的数据库交互领域中,对象关系映射(ORM)框架扮演着举足轻重的角色。近年来,随着技术的不断发展和进步,众多ORM框架如雨后春笋般涌现,其中Tortoise ORM以其高效、灵活的特性受到了广大开发者的青睐。本文将深入探讨Tortoise ORM框架的核心特性、使用方法以及其在Python开发中的应用。
2289 4
|
存储 关系型数据库 MySQL
MySQL数据库简介
MySQL数据库简介
|
算法 API C++
模型落地系列 | TensorRT应该如何添加自己的插件?
模型落地系列 | TensorRT应该如何添加自己的插件?
869 1
|
SQL 关系型数据库 MySQL
如何往MySQL中插入100万条数据?
往MySQL中大批量插入数据的正确做法
429 0
|
存储 缓存 算法
二倍均值随机算法之抢拼手气红包场景应用
拼手气类的游戏,更能激发用户购物和社交的趣味性,以及游戏竞争心理,拼手气类的活动甚至可以影响人们消费心理。拼手气红包就是最简单的例子。 顾名思义,二倍均值算法的核心思想是根据每次剩余的总金额M和剩余人数N,执行M/N再乘以2的操作得到一个边界值E,然后制定一个从0到E的随机区间,在这个随机区间内将产生一个随机金额R, 此时总金额M将更新为M-R,剩余人数N更新为N-1。再继续重复上述执行流程,以此类推,直至最终剩余人数N-1为0,即代表随机数已经产生完毕。
1605 0
二倍均值随机算法之抢拼手气红包场景应用