华为OD-E卷 - 最大矩阵和 100分(java)

题目
给定一个二维整数矩阵,要在这个矩阵中选出一个子矩阵,使得这个子矩阵内所有的数字和尽量大,我们把这个子矩阵称为和最大子矩阵,子矩阵的选取原则是原矩阵中一块相互连续的矩形区域

输入描述
输入的第一行包含2个整数n, m(1 <= n, m <= 10),表示一个n行m列的矩阵,下面有n行,每行有m个整数,同一行中,每2个数字之间有1个空格,最后一个数字后面没有空格,所有的数字的在[-1000, 1000]之间
输出描述
输出一行一个数字,表示选出的和最大子矩阵内所有的数字和
用例
用例一:
输入:

3 4
-3 5 -1 5
2 4 -2 4
-1 3 -1 3

输出:

20
注:5 -1 5 最大值矩阵
    4 -2 4
    3 -1 3

java代码

方法一

将每一个小矩形的长宽情况都列举出来,再根据每次所列出的长宽,将给出的大矩形切割,获得最大和。(此方法时空复杂度较高)

package odTest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class maxMatrix {
	static List<Integer> maxList= new ArrayList<>();
	static int line;
	static int column;
	static int wide;
	static int hight;
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int[] inputRefers =Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
		line = inputRefers[0];
		column = inputRefers[1];
		
		int[][] matrix =new int[inputRefers[0]][inputRefers[1]];
		for(int i=0;i<inputRefers[0];i++) {
			int[] inputLine = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
			for(int j=0;j<inputLine.length;j++) {
				matrix[i][j]=inputLine[j];
			}
		}
		judgeMean(matrix);
		Collections.sort(maxList, new Comparator<Integer>() {
			@Override
			public int compare(Integer arg0, Integer arg1) {
				return arg1-arg0;
			}
		});
		System.out.println(maxList.get(0));
	}

	private static void judgeMean(int[][] matrix) {
		//控矩形边的宽高长度
		for(int i=0;i<line;i++) {
			for(int j=0;j<column;j++) {
				wide = j+1;
				hight = i+1;
//				System.out.println("宽:"+wide+"高:"+hight);
				buildOriginPoint(matrix);
			}
		}
	}
	private static void buildOriginPoint(int[][] matrix) {
		for(int i=0;i<line;i++) {
			for(int j=0;j<column;j++) {
				//传入初始起点
				findMaxVal(matrix,i,j);
			}
		}
	}

	private static void findMaxVal(int[][] matrix, int originX, int originY) {
		//当初始起点超过给出矩阵的长度,直接返回。
		if(originX+hight>line) {
			return;
		}
		if(originY+wide>column) {
			return;
		}
		int sum = 0,max = 0;
		//这里再根据确定的长宽,分别找到对应的和。
		for(int i=0;i<hight;i++) {
			for(int j=0;j<wide;j++) {
				sum = sum+matrix[originX+i][originY+j];
			}
		}
		max = max<sum?sum:max;
//		System.out.println(sum);
		maxList.add(max);
	}
}

方法二

此方法,通过每一次循环得到每一列的和,通过相加列来判断最大和。采用 了Kadane’s Algorithm(卡丹算法)。

package odTest;

import java.util.Scanner;

public class maxMatrix1 {
	 public static void main(String[] args) {
	        Scanner input = new Scanner(System.in);

	        // 读取矩阵的行数(rows) 和 列数(cols)
	        int rows = input.nextInt();
	        int cols = input.nextInt();

	        // 读取矩阵数据
	        int[][] grid = new int[rows][cols];
	        for (int i = 0; i < rows; i++) {
	            for (int j = 0; j < cols; j++) {
	                grid[i][j] = input.nextInt();
	            }
	        }

	        // 计算并输出最大子矩阵和
	        System.out.println(findMaxSum(grid, rows, cols));
	    }

	    // 计算二维矩阵中的最大子矩阵和
	    public static int findMaxSum(int[][] grid, int rows, int cols) {
	        int maxSum = Integer.MIN_VALUE;

	        // 枚举上边界 top
	        for (int top = 0; top < rows; top++) {
	            int[] colSum = new int[cols]; // 列压缩数组,存储 top 到 bottom 之间的列和

	            // 枚举下边界 bottom
	            for (int bottom = top; bottom < rows; bottom++) {
	                // 计算 top 到 bottom 之间的列和
	                for (int col = 0; col < cols; col++) {
	                    colSum[col] += grid[bottom][col];
	                }

	                // 在压缩后的数组上求最大子数组和(Kadane's Algorithm)
	                maxSum = Math.max(maxSum, kadane(colSum));
	            }
	        }

	        return maxSum; // 返回最大子矩阵和
	    }

	    // 使用 Kadane's Algorithm 计算一维数组的最大子数组和
	    private static int kadane(int[] arr) {
	        int maxCurrent = arr[0], maxGlobal = arr[0];

	        // 遍历数组,计算最大连续子数组和
	        for (int i = 1; i < arr.length; i++) {
	            maxCurrent = Math.max(arr[i], maxCurrent + arr[i]); // 选择是否包含之前的子数组
	            maxGlobal = Math.max(maxGlobal, maxCurrent); // 更新最大和
	        }

	        return maxGlobal;
	    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981868.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java-实现PDF合同模板填写内容并导出PDF文件

可用于公司用户合同导出pdf文件 效果图 一、导入所需要jar包 <!--生成PDF--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency&…

如何排查服务器内存泄漏问题

服务器内存泄漏是一种常见的问题&#xff0c;可能导致系统性能下降甚至系统崩溃。以下是一般情况下用于排查服务器内存泄漏问题的步骤&#xff1a; 排查服务器内存泄漏问题的步骤&#xff1a; 监控系统资源&#xff1a; 使用系统监控工具&#xff08;如top、htop、free&#x…

Tampermonkey篡改猴官网,油猴脚本插件电脑版入口(含教程)

Tampermonkey&#xff08;篡改猴&#xff09;是一款功能强大的浏览器扩展工具&#xff0c;自2010年发布以来&#xff0c;已成为全球超过1000万用户的首选脚本管理器。它通过运行用户自定义的JavaScript脚本&#xff0c;赋予用户深度定制网页的能力&#xff0c;涵盖广告拦截、界…

Java高频面试之集合-03

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;说说ArrayList和LinkedList的区别 ArrayList 与 LinkedList 的详细对比 一、底层数据结构 特性ArrayListLinkedList存…

golang学习笔记——go语言安装及系统环境变量设置

文章目录 go语言安装go envgo getgoproxy测试安装 Go 插件安装 Go 插件依赖工具参考资料用户环境变量和系统环境变量用户环境变量系统环境变量示例设置环境变量的步骤设置用户环境变量设置系统环境变量 验证环境变量总结 2024年最火的5大Go框架1. Gin&#xff1a;高并发接口的“…

Composition API

为什么会产生 Composition API? Vue2 逻辑复用方式 缺点 Mixin (命名空间冲突、逻辑不清晰、不易复用)scoped slot 作用域插槽 (配置项多、代码分裂、性能差)Vue2 对 TS 支持不充分 Composition API 优点 逻辑代码更少, 更集中, 更易扩展更加丰富的 API 集成对 TS 来说,…

DeepSeek R1助力,腾讯AI代码助手解锁音乐创作新

目录 1. DeepSeekR1模型简介2. 歌词创作流程2.1 准备工作2.2 歌词生成技巧 3. 音乐制作环节3.1 主流AI音乐生成平台 4. 歌曲欣赏5. 总结展望 1. DeepSeekR1模型简介 腾讯AI代码助手最新推出的DeepSeekR1模型不仅在代码生成方面表现出色&#xff0c;其强大的自然语言处理能力也…

微信小程序接入deepseek

先上效果 话不多说&#xff0c;直接上代码&#xff08;本人用的hbuilder Xuniapp&#xff09; <template><view class"container"><!-- 聊天内容区域 --><scroll-view class"chat-list" scroll-y :scroll-top"scrollTop":…

angular+nodejs问卷调查系统

说明&#xff1a;我计划用angularmysqlnodejs&#xff0c;做一套问卷调查系统&#xff0c; 1.先设计数据库表&#xff0c; 2.然后添加模拟数据&#xff0c; 3.然后写几个查询方法 4.然后用nodejs写service服务&#xff0c;查询mysql数据 5.然后写contrller路由&#xff0c;指向…

Ubuntu20.04双系统安装及软件安装(五):VSCode

Ubuntu20.04双系统安装及软件安装&#xff08;五&#xff09;&#xff1a;VSCode 打开VScode官网&#xff0c;点击中间左侧的deb文件下载&#xff1a; 系统会弹出下载框&#xff0c;确定即可。 在文件夹的**“下载”目录**&#xff0c;可看到下载的安装包&#xff0c;在该目录下…

EasyDSS视频推拉流系统:清理缓存文件时如何确保缓存读写不受影响?

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户咨询&#xff0c;视频推…

VS Code C++ 开发环境配置

VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…

GPIO的简介

目录 一、GPIO简介 二、GPIO基本结构 三、GPIO位结构 1、整体结构和内部各结构 2、输入部分 1.保护二极管 2.输入模式 3.浮空/上拉/下拉配置 ​编辑 4.模拟输入 5.施密特触发器 3、输出部分 1.输出部分前段 2.输出模式 3.开漏/推挽输出 4.复用开漏/推挽输出 四…

EasyDSS视频推拉流/直播点播平台:Mysql数据库接口报错502处理方法

视频推拉流/视频直播点播EasyDSS互联网直播平台支持一站式的上传、转码、直播、回放、嵌入、分享功能&#xff0c;具有多屏播放、自由组合、接口丰富等特点。平台可以为用户提供专业、稳定的直播推流、转码、分发和播放服务&#xff0c;全面满足超低延迟、超高画质、超大并发访…

AI工具:免费-文字转语音TTsmaker

前言&#xff1a; 测试了一款好用的文字转语音工具&#xff0c;简单&#xff0c;个人用免费功能就足够了。 说明&#xff1a; TTSMaker&#xff08;马克配音&#xff09;是一款免费的文本转语音工具&#xff0c;提供语音合成服务&#xff0c;支持多种语言&#xff0c;包括中…

vue3 vite 两种监听pinia状态变化的方式比较:watch, $subscribe

首先搭建vue3 vite 项目 npm create vue选择pinia 或者自己安装pinia 自己安装需要 npm install pinia并在main.js中挂在上&#xff1a; const pinia createPinia() const app createApp(App) app.use(pinia) app.mount(#app)创建stores文件夹和counter.js文件 counter.j…

【算法学习之路】5.贪心算法

贪心算法 前言一.什么是贪心算法二.例题1.合并果子2.跳跳&#xff01;3. 老鼠和奶酪 前言 我会将一些常用的算法以及对应的题单给写完&#xff0c;形成一套完整的算法体系&#xff0c;以及大量的各个难度的题目&#xff0c;目前算法也写了几篇&#xff0c;题单正在更新&#xf…

【ThreeJS Basics 1-6】Camera

文章目录 Camera 相机PerspectiveCamera 透视相机正交相机用鼠标控制相机大幅度转动&#xff08;可以看到后面&#xff09; 控制组件FlyControls 飞行组件控制FirstPersonControls 第一人称控制PointerLockControls 指针锁定控制OrbitControls 轨道控制TrackballControls 轨迹球…

Java+SpringBoot+Vue+数据可视化的百草园化妆服务平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统背景 市场需求催生 在当今社会&#xff0c;化妆已经成为人们日常生活和各种重要场合中不可或…

React:Redux

Redux引入 Redux感觉像组件通信的中介 state存放被管理的状态 action是申请改哪些数据&#xff0c;传入什么参数 reducer是怎么修改数据 我的理解更像是action像一个储存方法的对象&#xff0c;reducer是具体的方法的实现&#xff0c;不同的方法实现也不一样 store是个仓库…