【LeetCode: 面试题 17.24. 最大子矩阵 | 动态规划 】

news/2024/6/16 9:33:38 标签: leetcode, 矩阵, 动态规划, java, 面试

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • 动态规划
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

⛲ 题目描述

给定一个正整数、负整数和 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

🌟 求解思路&实现代码&运行结果


动态规划

🥦 求解思路

  1. 再学习这道题题目之前,大家可以先去看一下另一道最大子数组和的题解,再来学习这道题目就会非常容易。【LeetCode: 53. 最大子数组和 | 暴力递归=>记忆化搜索=>动态规划 | 分治法 】
  2. 我们先来简单理解一下这道题目的意思,这道题目区别于53.最大子数组和最大的不同在于,53题是一维的,但是这道题目是一个升级的版本,是二维的,但是核心的求解内思路是一样的。
  3. 既让说思路是一样的?那么我现在知道怎么求解一个一维数组的方法,但是并不知道二维数组怎么求解?这该怎么办呢?我们直接将二维数组转换为一维数组进性求解即可,怎么转换呢?就是挨个遍历从start开始,到end结束的行,按照列对其进行一个压缩即可。
  4. 然后我们找到最大子矩阵的和,如果当前的子矩阵的和是最大的,我们直接更新,并且抓取矩阵的坐标,最后直接返回即可。
  5. 有了基本的思路,接下来我们就来通过代码来实现一下。

🥦 实现代码

java">class Solution {
    public int[] getMaxMatrix(int[][] matrix) {
        int m=matrix.length,n=matrix[0].length;
        int r1=0,c1=0,r2=0,c2=0;
        int max=Integer.MIN_VALUE,cur=0;
        for(int i=0;i<m;i++){
            int[] temp=new int[n];
            for(int j=i;j<m;j++){
                int start=0;
                cur=0;
                for(int k=0;k<n;k++){
                    temp[k]+=matrix[j][k];
                    cur+=temp[k];
                    if(cur>max){
                        max=cur;
                        r1=i;
                        c1=start;
                        r2=j;
                        c2=k;
                    }
                    if(cur<0){
                        cur=0;
                        start=k+1;
                    }
                }
            }
        }
        return new int[]{r1,c1,r2,c2};
    }
}

🥦 运行结果

时间复杂度:O(M*M*N)
在这里插入图片描述

空间复杂度:O(N)
在这里插入图片描述

💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述


http://www.niftyadmin.cn/n/350226.html

相关文章

Day4——数据库基础1

Day4——数据库基础 数据库基础--基于phpstudy自带的MySQL数据库&#xff08;下载了PHPstudy后就无需下载额外的MySQL&#xff09; 一、数据库概念1、为什么要学习数据库&#xff1f;2、什么是数据库&#xff1f;3、数据库的访问方式4、数据管理技术经历的三个阶段5、关系型数据…

一篇文章告诉你什么是Java内存模型

在上篇 并发编程Bug起源:可见性、有序性和原子性问题&#xff0c;介绍了操作系统为了提示运行速度&#xff0c;做了各种优化&#xff0c;同时也带来数据的并发问题&#xff0c; 定义 在单线程系统中&#xff0c;代码按照顺序从上往下顺序执行&#xff0c;执行不会出现问题。比…

20230522----重返学习-原生事件进阶-React中的合成事件-React中的样式私有化

day-075-seventy-five-20230522-原生事件进阶-React中的合成事件-React中的样式私有化 原生事件进阶 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /&…

Qt编程基础 | 第三章-控件 | 3.1、组合框

一、组合框 1.1、定义 QComboBox提供了一种向用户呈现选项列表的方式&#xff0c;以占用最少的屏幕空间。 组合框是一个显示当前项目的选择小部件&#xff0c;可以弹出可选择项目的列表。 组合框可以是可编辑的&#xff0c;允许用户修改列表中的每个项目。 QComboBox 除了显示…

基于JavaSpringBoot+Vue+uniapp实现微信小程序新闻资讯平台

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

chatgpt赋能Python-python_dog

Python Dog: 一个好玩的机器人狗 Python Dog是一个由Python编程语言编写的机器人狗。它是一个有趣且有用的工具&#xff0c;可以帮助您学习Python编程&#xff0c;并了解如何通过Python编写和控制机器人。在本文中&#xff0c;我们将介绍Python Dog的功能&#xff0c;并讨论为…

第3章 TensorFlow进阶

文章目录 第3章 TensorFlow进阶3.1 TensorFlow 的计算模型3.1.1 计算图的工作原理3.1.2 在不同计算图上定义和使用张量进行计算3.2.1 在 GPU 上执行简单的算术运算 3.2 TensorFlow 的嵌入层3.3 TensorFlow 的多层3.4 TensorFlow 实现损失函数3.4.1 softmax 损失函数3.4.1 稀疏矩…

案例19:Java私房菜定制上门服务系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…