二维数组任意一矩形块中数的和的最大值

设计思路:

  与之前求一维数组中连续子数组和的最大值方法相同。因为二维数组可以看做是几个一维数组的集合。例如:一个3×3的二维数组可以按行拆成3个一维数组。然后按求一维数组连续子数组的和求拆分后每一个子数组每一个子数组和,求得的每一个拆分后的数组的子数组和用一个List集合存起来。所以此处要用到三个List集合分别记录,相同的位置相加就形成一个矩形块(1,2行   1,2,3行   2,3行三种情况可加),加完之后的数据另外存入一个相同的List集合all,最后获取集合all中最大的值。即所求。

源码:

package ErWeishuzu;

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

public class ErWeishuzu {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
//        int t[][]= {{1,2,3},
//                    {4,5,6},
//                    {7,8,9}};
        int t[][]=new int[3][3];
        Scanner input=new Scanner(System.in);
        for(int i=0;i<=2;i++)
        {
            for(int j=0;j<=2;j++)
            {
                t[i][j]=input.nextInt();
            }
        }
        input.close();
    List<Integer> shuzu1=new ArrayList<Integer>();
    List<Integer> shuzu2=new ArrayList<Integer>();
    List<Integer> shuzu3=new ArrayList<Integer>();
        int o1[]=new int[3];//拆分二维数组
        for(int i=0;i<=2;i++)
        {
            o1[i]=t[0][i];
            shuzu1.add(o1[i]);
        }
        
        int o2[]=new int[3];
        for(int i=0;i<=2;i++)
        {
            o2[i]=t[1][i];
            shuzu2.add(o2[i]);
        }
        
        int o3[]=new int[3];
        for(int i=0;i<=2;i++)
        {
            o3[i]=t[2][i];
            shuzu3.add(o3[i]);
        }
        
        
        List<Integer> all1=new ArrayList<Integer>();//存每一个拆分获得的数组的连续子数组的和
        List<Integer> all2=new ArrayList<Integer>();
        List<Integer> all3=new ArrayList<Integer>();
        List<Integer> all=new ArrayList<Integer>();
        for(int j=-1;j<=(shuzu1.size()-2);j++)
        {
            int sum=0;
            for(int i=j+1;(i<=shuzu1.size()-1);i++)
            {
                sum=sum+shuzu1.get(i);
                //System.out.println(sum);
                all1.add(sum);
                all.add(sum);
            }
        }
        
        for(int j=-1;j<=(shuzu2.size()-2);j++)
        {
            int sum=0;
            for(int i=j+1;(i<=shuzu2.size()-1);i++)
            {
                sum=sum+shuzu2.get(i);
                //System.out.println(sum);
                all2.add(sum);
                all.add(sum);
            }
        }
        
        for(int j=-1;j<=(shuzu3.size()-2);j++)
        {
            int sum=0;
            for(int i=j+1;(i<=shuzu3.size()-1);i++)
            {
                sum=sum+shuzu3.get(i);
                //System.out.println(sum);
                all3.add(sum);
                all.add(sum);
            }
        }
        
        for(int i=0;i<=(all1.size()-1);i++)
        {
            int a,b,c;
            a=all1.get(i)+all2.get(i)+all3.get(i);
            all.add(a);
            b=all1.get(i)+all2.get(i);
            all.add(b);
            c=all2.get(i)+all3.get(i);
            all.add(c);
        
        }
        Collections.sort(all); 
        System.out.print("最大子数组的和:");
        System.out.println(all.get(all.size()-1));
    }

    }

运行结果:

原文地址:https://www.cnblogs.com/janeszj/p/10589101.html