`

java-35.求一个矩阵中最大的二维矩阵 ( 元素和最大 )

 
阅读更多
the idea is from:http://blog.csdn.net/zhanxinhang/article/details/6731134

public class MaxSubMatrix {

	/**see http://blog.csdn.net/zhanxinhang/article/details/6731134
	 * Q35
求一个矩阵中最大的二维矩阵 ( 元素和最大 ). 如 :
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是 :
4 5
5 3
three solutions:
1.brutalFind:calculate all the possible sum and find the largest
2.verticalFind:when matrix's rowIndex is larger than columnIndex,like "int[][] b" in the following code
3.herizonalFind:when matrix's rowIndex is smaller than columnIndex,like "int[][] a" in the following code
both 2 and 3 avoid duplicate calculation
	 */
	public static void main(String[] args) {
		MaxSubMatrix msm=new MaxSubMatrix();
		int[][] a={
				{2,3,4},
		        {1,3,3},
		        {1,4,6},
		        {1,4,8},
		        {2,3,2},
		};
		int[][] b={
				{1, 2, 0, 3, 4},
		        {2, 3, 4, 5, 1},
		        {1, 1, 5, 3, 0},
		};
		
		int[][] result=msm.findSumMaxSubMatrix(a);
		msm.printArray(result);
		System.out.println("----------------");
		result=msm.brutalFind(a);
		msm.printArray(result);
		System.out.println("----------------");
		
		result=msm.findSumMaxSubMatrix(b);
		msm.printArray(result);
		System.out.println("----------------");
		result=msm.brutalFind(b);
		msm.printArray(result);
	}
	
	public int[][] findSumMaxSubMatrix(int[][] a){
		int[][] result=null;
		int row=a.length;
		int col=a[0].length;
		if(row>=col){
			result=herizonalFind(a,row,col);
		}else{
			result=verticalFind(a,row,col);
		}
		return result;
	}
	
	public int[][] brutalFind(int[][] a){
		int[][] result=new int[2][2];
		int row=a.length;
		int col=a[0].length;
		int sum=0;
		int p=0;
		int q=0;
		for(int i=0;i<row-1;i++){
			for(int j=0;j<col-1;j++){
				int x=a[i][j];
				int y=a[i][j+1];
				int z=a[i+1][j];
				int k=a[i+1][j+1];
				int temp=x+y+z+k;
				if(temp>sum){
					sum=temp;
					p=i;
					q=j;
				}
			}
		}
		result[0][0]=a[p][q];
		result[0][1]=a[p][q+1];
		result[1][0]=a[p+1][q];
		result[1][1]=a[p+1][q+1];
		return result;
	}
	
	public int[][] herizonalFind(int[][] a,int row,int col){
		int[][] result=new int[2][2];
		int lastHerizonalSum=a[0][0]+a[0][1];
		int sum=0;
		int p=0;
		int q=0;
		for(int i=1;i<row;i++){
			for(int j=0;j<col-1;j++){
				int temp=lastHerizonalSum+a[i][j]+a[i][j+1];
				lastHerizonalSum=a[i][j]+a[i][j+1];
				if(temp>sum){
					sum=temp;
					p=i;
					q=j;
				}
			}
		}
		result[0][0]=a[p-1][q];
		result[0][1]=a[p-1][q+1];
		result[1][0]=a[p][q];
		result[1][1]=a[p][q+1];
		return result;
	}
	
	public int[][] verticalFind(int[][] a,int row,int col){
		int[][] result=new int[2][2];
		int lastVerticalSum=a[0][0]+a[1][0];
		int sum=0;
		int p=0;
		int q=0;
		for(int i=0;i<row-1;i++){
			for(int j=1;j<col;j++){
				int temp=lastVerticalSum+a[i][j]+a[i+1][j];
				lastVerticalSum=a[i][j]+a[i+1][j];
				if(temp>sum){
					sum=temp;
					p=i;
					q=j;
				}
			}
		}
		result[0][0]=a[p][q-1];
		result[0][1]=a[p][q];
		result[1][0]=a[p+1][q-1];
		result[1][1]=a[p+1][q];
		return result;
	}
	
	public void printArray(int[][] a){
		int row=a.length;
		int col=a[0].length;
		for(int i=0;i<row;i++){
			for(int j=0;j<col;j++){
				System.out.print(a[i][j]+" ");
			}
			System.out.println();
		}
	}
}

1
0
分享到:
评论

相关推荐

    zxing-3.1.0.jar和zxing-javase-3.1.0.jar

    总之,ZXing库为Java开发者提供了一个强大且灵活的工具,用于处理二维码和其他条形码。通过`zxing-3.1.0.jar`和`zxing-javase-3.1.0.jar`,可以在各种Java环境中轻松地实现二维码的生成和解析,包括在带有logo的...

    jama-1.0.3.jar线性代数Java包

    - **图像处理**:图像可以表示为二维矩阵,矩阵运算可用于图像增强、旋转等操作。 四、源码分析 除了jama-1.0.3.jar包,压缩包内还包含jama-1.0.3-sources.jar,这是源代码文件,开发者可以直接查看和学习其内部...

    10-to-2.zip_进制矩阵转换

    总的来说,进制矩阵转换是计算机科学基础中的一个重要概念,理解和掌握这项技能对于学习和应用计算机技术至关重要。这个压缩包提供的资源可能是为了帮助初学者或者开发者更有效地进行这种转换,从而提升他们的编程...

    Java 求一个3*3矩阵对角线元素之和.rar

    Java 求一个3*3矩阵对角线元素之和,实现的思路主要是利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。也就计算对角线之和。计算对角线之和代码分享:  for(int i = 0;i ;i )  {   for(int j = 0;j ;j ...

    zxing的两个jar,分别是core-2.2.jar和javase-2.2.jar

    - **BitMatrix**:表示二维条码的二进制矩阵数据结构。 - **BarcodeFormat**:枚举了所有支持的条码格式。 2. **ZXing Java SE库(javase-2.2.jar)**: `javase-2.2.jar`是ZXing针对Java Standard Edition(SE...

    zxing-3.1.0.jar包及javase-3.1.0包

    在描述中提到的`MatrixToImageWriter.writeToPath()` 方法,是ZXing库中用于将条码数据矩阵(一个二维布尔数组)转换为图像文件的方法。这个方法在ZXing的`core`模块中定义,允许开发者将条码数据写入指定路径的图像...

    Java-Sparse-Matrix-master.zip_matrix sparse java

    - 可以使用类来表示稀疏矩阵,包含三个主要成员:非零元素个数、行数、列数,以及一个二维数组或列表存储三元组。 - 初始化:根据输入的矩阵,遍历并收集非零元素的三元组信息。 - 基本操作:包括加法、减法、...

    java 矩阵学习包 jama-1.0.3.jar

    Java矩阵学习包JAMA-1.0.3.jar是一个专门用于矩阵运算的库,它为Java程序员提供了一个方便、高效的方式来处理线性代数问题。这个库被广泛应用于机器学习、数据分析、科学计算以及工程计算等领域,因为它简化了复杂的...

    找出一个二维数组的鞍点,即该位置上的元素在该行上最大、在列上最小(也可能没有鞍点)。Java

    在编程领域,鞍点(Saddle Point)是指在一个矩阵中,某个元素在同一行中最大,同时在同一列中最小。这是一个相对特殊的位置,因为通常我们关注的是最大值或最小值,而鞍点则结合了这两种特性。在Java编程中,解决这...

    Java-chess.rar_chess_java 象棋

    在本项目中,我们关注的是一个基于Java编程语言实现的象棋游戏。"Java-chess.rar" 是一个压缩包文件,其中包含了实现这个Java象棋程序的相关代码和资源。从描述中我们可以了解到,该程序已经增加了保存当前棋局的...

    java版高斯图片模糊,不含依赖库,可运行。java-Gaussian.zip

    在图像处理中,我们用高斯核(一个二维的高斯函数矩阵)对图像的每个像素进行加权平均,权重由高斯函数决定。距离中心像素越远的像素,其权重越小,因此,边缘的像素对中心像素的影响较小,从而实现模糊效果。 在...

    com.google.zxing-3.2.1.rar

    ZXing是一个多格式的一维/二维条码图像处理库,支持读取、生成、解码和编码各种条码和二维码。 描述中提到的"将支付链接生成二维码所需",指的是ZXing库在支付场景中的应用。在移动支付中,经常需要将一个包含支付...

    java算法——上三角、下三角、对称矩阵

    在Java中,我们可以创建一个二维数组,并初始化对角线以下的元素为0来实现上三角矩阵。 下三角矩阵与上三角矩阵相反,它的主对角线以上所有元素都是0。这种矩阵同样适用于线性代数问题的处理,比如解逆矩阵或计算...

    java-array.zip_源代码;array

    5. 多维数组:Java支持多维数组,如二维数组(矩阵)。 二、Java集合框架 1. 集合接口:集合框架的核心是`Collection`接口,它有两个主要子接口——`List`和`Set`。 2. `List`接口:有序的集合,允许有重复元素,如...

    JAVA-experiment-2.zip_experiment的定义

    在二维数组中,转置后的数组第i行第j列的元素应该和原数组的第j行第i列的元素相同。下面是一个实现数组转置的示例: ```java int[][] transposedArray = new int[5][5]; for (int i = 0; i ; i++) { for (int j =...

    Java-for-dimensional-barcode.rar_二维码解析

    二维码,全称为二维条形码,是一种矩阵式条码,它能够存储比传统一维条形码更多的信息。通过编码算法,二维码将文本、数字、URL等数据转换为黑白相间的图形,以便由扫描设备读取。 在Java中实现二维码生成,我们...

    daima.rar_JAVA编写5*5矩阵

    在Java编程语言中,创建和操作二维数组是常见的任务,特别是在构建矩阵时。"daima.rar_JAVA编写5*5矩阵"这个压缩包显然包含了关于如何使用Java编写一个5行5列矩阵的示例代码。这个程序由两个类组成:`matrix`和主类`...

    java--gobang.rar_java goba

    5. **数据结构**:棋盘状态的存储通常会用到二维数组或矩阵,表示棋盘上每格的状态(空、黑棋、白棋)。此外,可能还会使用栈或队列来保存历史步数,便于回溯或撤销操作。 6. **错误处理**:良好的错误处理机制是...

    矩阵转置java程序

    - **实现逻辑**:创建一个新的二维数组作为转置后的矩阵,并通过双重循环遍历原始矩阵的每个元素,将其放置到转置矩阵的相应位置上。 ##### 4. `covertMatrix(int matrix[][])` - **功能描述**:此方法也用于实现...

    2048游戏,java-gui.zip

    2048游戏的核心算法是基于二维数组的矩阵操作。游戏开始时,数组的四个随机位置生成两个2,然后每次玩家上、下、左、右滑动,数组中的数字会按照一定的规则进行合并和移动。这个过程涉及到的主要算法有: 1. **合并...

Global site tag (gtag.js) - Google Analytics