zoukankan      html  css  js  c++  java
  • 二维数组任意一矩形块中数的和的最大值

    设计思路:

      与之前求一维数组中连续子数组和的最大值方法相同。因为二维数组可以看做是几个一维数组的集合。例如:一个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));
        }
    
        }

    运行结果:

  • 相关阅读:
    数据库优化方案之分库分表
    聊聊ThreadLocal源码(基于JDK1.8)
    HashMap扩容死循环问题
    Synchronized偏向锁和轻量级锁的升级
    【Java并发编程之深入理解】Synchronized的使用
    ConcurrentHashMap 1.8为什么要使用CAS+Synchronized取代Segment+ReentrantLock
    面试必备技能:HashMap哪些技术点会被经常问到?
    序列键生成器及单例多例模式
    Effective.Java第1-11条
    抽象工厂(AbstractFactory)模式
  • 原文地址:https://www.cnblogs.com/janeszj/p/10589101.html
Copyright © 2011-2022 走看看