• 数组--二维数组求最大子数组


    二维数组求最大子数组

    思路:

    每一个二维矩阵的子数组就相当一个小的矩阵,将所有的矩阵的之都求出来然后进行比较就可以了。

    思路误区:

    最开始一直想的都是怎么去求最大的矩阵,到那时一直都没有找到求最大矩阵的方法,然后就一直眼睛盯着那个最大的矩阵看,其实一直都有一种方法,但是自己一直觉得这种方法比较麻烦,最后开始做了才知道并没有自己想象中的那么麻烦。

    package zuoye_02;
    
    import java.util.*;
    
    public class shuzu {
    	static Scanner scanner = new Scanner(System.in);
    	public static void main(String args[]){ 
    		int m,n;
            int b;
            Scanner scanner = new Scanner(System.in);
            System.out.println("二维数组的列数:");
            m = scanner.nextInt();
            System.out.println("二维数组的行数:");
            n = scanner.nextInt();
            int arr[][] = new int[n][m];
            System.out.println("请输入二位数组:");
            for(int i = 0;i<n;i++)
            	for(int j=0;j<m;j++)
            	{
            		arr[i][j] = scanner.nextInt();
            		}
            System.out.println("
    ");
            b = maxArrSum(arr);
            System.out.println("最大子数组的最大和为"+b);
            }
    	
    	public static int[][] arrSum(int arr[][]){
    		int m = arr.length;
            int n = arr[0].length;
            int p[][] = new int[m+1][n+1];
            p[0][0] = arr[0][0];
            for(int i=0; i<=m; i++) p[i][0] = 0;
            for(int i=0; i<=n; i++) p[0][i] = 0;
            for(int i=1; i<=m; i++)
            {
            	for(int j=1; j<=n; j++){
            		p[i][j] = p[i-1][j] + p[i][j-1] + arr[i-1][j-1] - p[i-1][j-1];
            		}
            	}
            return p;
            }
    
        //遍历所有二维数组的矩形区域
    	    static int  maxArrSum(int arr[][]){
    		int m = arr.length;
            int n = arr[0].length;
            int p[][] = arrSum(arr);
            int ans = Integer.MIN_VALUE;
            for(int i=1; i<=m; i++)
            {
            	for(int j=1; j<=n; j++)
            	{
            		for(int endi=i; endi <=m; endi++)
            		{
            			for(int endj=j; endj<=n; endj++)
            			{   
            				int sum = p[endi][endj] - p[i-1][endj] - p[endi][j-1] + p[i-1][j-1];
                            if(ans < sum) ans = sum;    
                        }
                    }    
                }    
            }    
            return ans;    
        }     
    }
    

      

    总结:

    这个问题最开始自己想的太复杂了,想来几种方法都觉得特别的麻烦而没有下手做,最后还是别人说的一种比较简单的方法才做的。

  • 相关阅读:
    怎样理解HTMLCollection接口
    怎样单独遍历NodeList的键、值和键值对
    怎样获取NodeList某位置上的节点
    怎样遍历NodeList对象
    怎样理解NodeList的动态集合与静态集合
    怎样将类似数组的对象转换为数组
    怎样理解 instanceof
    怎样清理当前节点下的所有文本节点
    怎样移除当前节点
    怎样判断一个节点是否相等 / 是否相同
  • 原文地址:https://www.cnblogs.com/zhoulonghai/p/10994539.html
Copyright © 2020-2023  润新知