IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 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

?首先使用基础引入:53.最大子序列和

????????在该问题中,数据从一维变成了二维,但实质相同,同样是再求最大子序和,需要将二维转化为一维,对于矩阵的每一列,将其加在一起,成为了一维上的一个数,二维矩阵的和转化为了一维数组的和。

捕获.JPG

将二维问题转化为了一维问题,现在另一个问题就是怎么把所有情况都遍历到呢?

我们以第i行为第一行,向下延伸,设最后一行为第j行,我们就i在这么一个范围内,将二维问题转化为一维问题,再求解最大子序列和。

捕获2.JPG


代码实现

import java.util.*;

// 最大子矩阵的和
public class Main1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int[][] matrix = new int[n][m];
		for(int i = 0; i < n; i ++) {
			for(int j = 0; j < m; j ++) {
				matrix[i][j] = sc.nextInt();
			}
		}
		
		int ans = getMaxSubMatrix(matrix);
		System.out.println(ans);
	}

	private static int getMaxSubMatrix(int[][] matrix) {
		// TODO Auto-generated method stub
		int n = matrix.length;
		int m = matrix[0].length;
		int[] indexBE = new int[4];
		int[] b = new int[m]; //记录当前i~j行组成大矩阵的每一列的和,将二维转化为一维
		int sum = 0; //相当于dp[i],dp_i
		int maxSum = Integer.MIN_VALUE; //记录最大值
		int rowTemp = 0;
		int colTemp = 0;//暂时记录左上角,相当于begin
		
		 //以i为上边,从上而下扫描
		for(int i = 0; i < n; i ++) {
			// 每次更换子矩形上边,就要清空b,重新计算每列的和
			for(int t = 0; t < m; t ++) {
				b[t] = 0;
			}
			// 子矩阵的下边,从i到N-1,不断增加子矩阵的高
			for(int j = i; j < n; j ++) {
				//一下就相当于求一次最大子序列和
                sum = 0;//从头开始求dp
                for(int k = 0; k < m; k ++) {
                	b[k] += matrix[j][k];
                	//我们只是不断增加其高,也就是下移矩阵下边,所有这个矩阵每列的和只需要加上新加的哪一行的元素
                	//因为我们求dp[i]的时候只需要dp[i-1]和nums[i],所有在我们不断更新b数组时就可以求出当前位置的dp_i
                	if(sum > 0) {
                		sum += b[k];
                	}else {
                		sum = b[k];
                		rowTemp = i;
                		colTemp = k;
                	}
                	if(sum > maxSum) {
                		maxSum = sum;
                		indexBE[0] = rowTemp;
                		indexBE[1] = colTemp;
                		indexBE[2] = j;
                		indexBE[3] = k;
                	}
                }
			}
		}
		return maxSum;
	}

}

/*
3 4
-3 5 -1 5
2 4 -2 4
-1 3 -1 3
*/

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 09:36:03  更:2021-08-28 09:37:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:41:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码